21
移动互联网开发笔记 vol 1 掌星 封面图片来源:Seven Pillars Lord Abbaddon ,CC授权

掌星 移动互联网开发笔记-Vol001

Embed Size (px)

DESCRIPTION

掌星 移动互联网开发笔记-Vol001

Citation preview

Page 1: 掌星 移动互联网开发笔记-Vol001

移动互联网开发笔记 vol 1掌星

封面图片来源:Seven Pillars Lord Abbaddon ,CC授权

Page 2: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

目录- 刊首语

- 征稿

- 在IOS项目开发中使用单例类共享应用配置信息

- 基于 xib的 tableViewCell的个性化定制

- 一种让UILabel自适应内容大小的方法

Page 3: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

刊首语

这是一个颠覆的时代,移动互联网正改变着我们的生活方式,也改变着开发者的开发方向,愤怒的小鸟成功的故事也让无数的开发者进入移动互联网开发领域,你准备好了没?

《掌星-移动互联网开发笔记》是致力于普及和推广移动互联网开发技术免费电子文档,虽然看起来目前还很简陋,但我们不断努力完善,和中国的无线互联网一同发展,希望大家多多支持。

Page 4: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

征稿!!!

不管您是经验丰富的移动互联网开发人员,还是初涉移动互联网的菜鸟开发者,不管你是从事ipad, iphone,android, htm5开发,windows phone, webos, blackberryos, j2me 等平台开发,只要你觉得你自己的开发经验是对别人有帮助的,都可以投稿给《掌星》,我们的定位是技术笔记,不需要文章有华丽得辞藻或者多么高深的技术,只要是你在日常得项目中过的内容和技术即可。

投稿可以发邮件给 [email protected], 最好附赠您得联系方式,姓名和所在的公司,文章采用后我们会注明您的版权信息,并且有小礼物寄送哦。

Page 5: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

在IOS项目开发中使用单例类共享应用配置信息作者:RainX (北京掌览天下信息科技有限公司)

在iphone或者ipad开发的过程中,我们经常需要使用一些需要在全局共享的资源或者需要在多个页面共享的资源,比如某个应用的客户端需

要有一个登陆功能,在用户登陆后需要记住用户的用户名(假定用户的名字是旺财”,在登陆之后的每个页面中里都会在顶部显示一段“你

好, 旺财”的字样。当然了,这个简单的小功能实现起来应用非常容易,也有很多的实现方法,对objective-c这样面向对象的程序语言来

说,选用单例模式进行开发是非常方便,且容易实现的。这里我们就针对这个简单的小例子来说明一下单例模式在ios平台下的使用实例,并

在后面介绍一下如何将单例变量中的变量保存到磁盘上,供下次进入的时候使用。这个方式也是我们近期的几个项目里应用到的。

我们的目标就是建立一个小的应用,实现程序的登陆功能,并且在登陆成功之后将用户名称记录在内存中,供我们的程序在后面的页面中调

用,然后进一步扩展,将用户名同时记录在文件中,当用户下次再次启动这个应用的时候,在登陆页面默认在用户名的输入框中显示用户的

名称。

首先建立页面,启动XCode 新建一个工程命名为 SingletonDemo, 在SingletonDemoViewController.xib中拖入输入框,以及确认按钮,

在代码中生命对应的属性和方法,用户名输入框为 usernameTextField, 密码未 passwordTextField; 对应的登陆按钮touch down信号的响

应方法为 performLogin: 下面是对应的代码

在 SingletonDemoViewController.h ,增加

Page 6: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

在 SingletonDemoViewController.m中增加

首先介绍一下单例模式本身。

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和

一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名

称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引

用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类

保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他

处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通

过该类提供的静态方法来得到该类的唯一实例。

这里我们采用这篇文章中介绍的方法:

http://www.numbergrinder.com/2008/12/patterns-in-objective-

c-singleton-pattern/

Page 7: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

使用类方法instance返回单例类的实例,其实例保存在类方法instance 的一个静态局部变量里,注意这个实现没有完成将构造函数私有化的功能,因为OC本身对私有化的支持就不是很完善,所以我们在后续的代码中,需要注意不要直接使用 [[Singleton alloc] init] 来给变量赋值,而需要使用 [Singleton instance] 来获取对象的实例。

OK,现在单例类的构造方法实现了,我们还需要实现一些逻辑在里面,根据我们应用的设计,这个单例类主要为了保存应用程序中用户名的状态,所以我们需要给他增加用户名的属性,添加完成后的类变为

Singleton.h

Singleton.m

Page 8: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

有了单例类,我们就可以在我们的代码里面开始应用它

在 SingletonDemoViewController.m的 performLogin: 里面加入登陆的代码,由于是一个demo,这里我们只做一个简单的验证,我们不管用户名输入什么,只要密码是 wangwang的用户为合法的用户:

这里我们使用了一个ContentViewController 建立了内容页面,内容页面的内容可以自己定制,当然,为了展示下我们的单例类的使用,我们可以在ContentViewController的里建立一个UILabel , 然后在载入的时候显示“你好,XXX”

这里是对应的代码:

这里注意在需要调用Singleton类的文件中需要#import "Singleton.h"

有的时候,我们还需要将Singleton中的内容序列化保存在文件,供下次应用再次被启动时调用(比如关机后再重启),这里我也简单介绍一下我的实现方法,

其实思路比较简单,就是在Singleton类中实现 -commit 方法,将需要序列化的内容写入文件即可,当然写入文件的方法有很多种,比如配置相关的内容,就可以通过 NSUserDefaults来保存,在我开发的项目里面,为了保存的路径比较灵活,我通常使用NSMutableDictionary的writeToFile 和dictionaryWithContentsOfFile实现文件的保存和读取。代码如下

Page 9: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

Singleton.m中增加

Page 10: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

这样,在我们的程序例,在 performLogin: 里面加入一行

在 SingletonDemoViewController.m的viewDidLoad中增加

既可以实现用户输入框的记住密码功能了。

由于IOS的SDK里面没有类似android的adk里的 android.app.Application 类实现 ApplicationContext ,或者Intent类实现页面信息传递,所以我们大量的应用单例类来实现程序状态信息的传递和保存。OK..Singleton在我们项目中的用法就介绍到这里了。

Page 11: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

简介

在iphone或者ipad开发中,我们经常会用到tableview,以及一些个性化的 TableViewCell. 但在代码中对tableViewCell的调整往往效率比较低下,如果能在图形界面进行cell的调整,对我们的开发效率将会是很大的提高. 今天我将为大家介绍一下 基于interface Builer的tableViewCell的开发. 我们的目标是展现一个 tableView, view中有三个cell,分别展示 姓名,年龄,单位. 话不多说,让我们进入 tableView的奇妙旅程吧.

基于xib的tableViewCell的个性化定制作者:侯波林 (北京掌览天下信息科技有限公司)

正传

建立工程

首先,打开你的xcode, 新建一个名为 myTableViewWithNib的工程(基于window-based Application).新建一个 名为MyTableViewController 的类.默认的 MyTableViewController 实现的是 UITableViewCell , 将他修改成 UITableViewController

Page 12: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

编写代码在 MyTableViewController.h中声明 如下几个变量

IBOutlet UITableViewCell* nameCell;IBOutlet UITableViewCell* ageCell;IBOutlet UITableViewCell* companyCell;IBOutlet UITextField* name;IBOutlet UITextField* age;IBOutlet UITextField* company;IBOutlet UILabel *namLable;IBOutlet UILabel *ageLable;IBOutlet UILabel *companyLable;

修改后代码如下

@interface MyTableViewController : UITableViewController {IBOutlet UITableViewCell* nameCell;IBOutlet UITableViewCell* ageCell;IBOutlet UITableViewCell* companyCell;

IBOutlet UITextField* name;IBOutlet UITextField* age;IBOutlet UITextField* company;IBOutlet UILabel *namLable;IBOutlet UILabel *ageLable;IBOutlet UILabel *companyLable;

}

@property(nonatomic,retain) UITableViewCell* nameCell;@property(nonatomic,retain) UITableViewCell* ageCell;@property(nonatomic,retain) UITableViewCell* companyCell;

@property(nonatomic,retain) UITextField* name;@property(nonatomic,retain) UITextField* age;@property(nonatomic,retain) UITextField* company;

@property(nonatomic,retain) UILabel *namLable;@property(nonatomic,retain) UILabel *ageLable;@property(nonatomic,retain) UILabel *companyLable;

Page 13: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

* 在MyTableViewController.m中增加如下几个方法

//tableview加载的时候,第一个执行的方法- (void)viewDidLoad {}//返回tableView中的section数量- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 3;}

//返回section中的数量- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

// Return the number of rows in the section.return 1;

}

// 这里实现定制的cell- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];}

return cell;}

Page 14: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

创建xib文件

•在other Sources 中新建名为 MyTableViewController 的xib文件(基于一个view xib即可).•创建后,双击打开创建好的MyTableViewController 文件•在Tools中找到 Library ,点击打开•在Library中找到Talb View,拖入 xib中,删除原来的 View.•双击 File's Owner,将outLet中的view关联到拖入的tableView中•在Library中找到 Table View Cell,将之拖进 xib中,由于我们用到了3个cell,所以拖入3个Table View Cell,并分别命名为nameCell,ageCell,companyCell•修改 MyTableViewController.xib的 class 为 MyTableViewController (command+4键)•按command+2 ,在Outlet栏里会看到我们在代码里声明的属性•拖动 相应的属性和我们已经拖入xib的 table View Cell进行关联(按照之前的命名,进行关联.)•在我们的cell中我们显示了一个 UITextField,所以需要在每个table View Cell中拖入一个 UITextField.•双击拖入的 text Field,调整宽度和高度,这里我们调整 text Field的 x,y和宽段,高度分别为 80,10, 200,31,设置对其方式为居中对齐•为了更好的显示文字,我们需要一个 UILable,我们同样采用xib的方式拖入 table View Cell下,在每个cell下各放置一个lable,并根据cell的名称,分别 在lable上输入姓名,年龄,公司•分别打开拖入的 UILable,编辑lable中的文字,同时设置 x,y,宽度高度分别为 20,13,40,20

Page 15: 掌星 移动互联网开发笔记-Vol001

编辑代码

掌星 zhangxing.info

这里我们要展示的是三行信息,分别是 姓名,年龄和公司编辑MyTableViewController.m,找到我们刚才添加的 cellForRowAtIndexPath函数,编辑后代码如下

NSInteger section = indexPath.section;NSInteger row = indexPath.row;

NSString *CellIdentifier = [[NSString alloc] initWithFormat:@"Cell %d",section];

UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];

//如果是第一行,显示姓名 .if(section == 0){

cell = nameCell;}//如果是第二行,显示公司if(section == 1){

cell = companyCell;}

//如果是第3行, 显示年龄if(section == 2){

cell = ageCell;}//去掉cell的显示效果cell.selectionStyle = UITableViewCellSelectionStyleNone;return cell;

Page 16: 掌星 移动互联网开发笔记-Vol001

增加的代码主要是根据section的不同,返回之前定义的不同的cell,通过这种方式可以减少在布局上花费的时间,大大的提高工作效率.

好了,我们的工作完成了,build一下看看效果吧

掌星 zhangxing.info

Page 17: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

一般情况下,在 iOS中 UI 控件的尺寸和位置都是创建时固定好的。当控件内容物超过控件尺寸时,通常只会出现两种情况:内容物被控件外框截断;或内容物自由溢出控件外框,影响其他 UI 控件的展现。但在基于 iOS 的实际项目开发过程中,往往会遇到这样一种需求:要求 UILabel控件随内容文本的多少自动扩张或紧缩。这就要求我们必须找到一种能够计算出恰当的 UILabel外框尺寸的方案。

实际上,NSString类提供了 sizeWithFont:constrainedToSize:lineBreakMode: 方法,可以根据展现时所用的字体、换行模式等信息计算出包围指定 NSString字符串所需的最小外框尺寸。利用该方法就可以实现自适应内容的 UILabel。

下面让我们用一个简单的例子来演示这个方案。这个演示程序只有一个主视图,其中包含了一个 UILabel和其下方的 UIButton,最终的效果是点击 UIButton时 UILabel中的文本在长文本和短文本之间切换,而 UILabel始终适应文本大小,且 UIButton位置也随之进行相应的调整。

首先创建出项目骨架:

• 启动 XCode,创建一个 View-based Application 类型的新项目 !AutoResize• 双击项目 Resources 分组下的 !AutoResizeViewController.xib在 Interface Builder 中打开它,向 UIView主视图中拖入一个 UILabel和一个 UIButton,二者的尺寸分别为 (x=0, y=0, w=320, h=75) 和 (x=124, y=85, w=72, h=37)

• 回到 XCode编辑 AutoResizeViewController.h,在 AutoResizeViewController 类声明中添加如下新属性和动作:

一种让UILabel自适应内容大小的方法作者:Chaoslawful (淘宝北京)

Page 18: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

• 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加如下实现代码:

• 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加如下实现代码:

下面是重头戏出场,我们将计算 UILabel的合适外框尺寸并调整 UILabel和 UIButton的位置和大小的功能抽离为一个名为 resizeUI的方法,这样在任何更改了 UILabel文本的地方简单地调用 resizeUI 方法,即可更新界面布局:

• 编辑 AutoResizeViewController.h,在 AutoResizeViewController 类声明中添加该方法的声明:

Page 19: 掌星 移动互联网开发笔记-Vol001

掌星 zhangxing.info

• 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加该方法的实现:

• 修改 viewDidLoad方法,增加对 resizeUI方法的调用,以便在初始化视图后正确调整控件尺寸:

Page 20: 掌星 移动互联网开发笔记-Vol001

• 向 toggleText方法增加切换长短文本的逻辑:

Page 21: 掌星 移动互联网开发笔记-Vol001

http://zhangxing.info

专注移动互联网,我们和中国的移动互联网一同成长