SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
掌星                        移动互联网开发笔记   vol 1




封面图片来源:Seven Pillars Lord Abbaddon ,CC授权
掌星 zhangxing.info
   目录
                    - 刊首语

                    - 征稿

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

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

                    - 一种让UILabel自适应内容
                      大小的方法
掌星 zhangxing.info



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


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


征                     不管您是经验丰富的移动互联网开发人员,还
                    是初涉移动互联网的菜鸟开发者,不管你是从事


稿
                    ipad, iphone,android, htm5开发,
                    windows phone, webos, blackberryos, j2me
                    等平台开发,只要你觉得你自己的开发经验是对
                    别人有帮助的,都可以投稿给《掌星》,我们的


!
                    定位是技术笔记,不需要文章有华丽得辞藻或者
                    多么高深的技术,只要是你在日常得项目中过的
                    内容和技术即可。



!                    投稿可以发邮件给 rainx@zhangxing.info, 最
                    好附赠您得联系方式,姓名和所在的公司,文章


!
                    采用后我们会注明您的版权信息,并且有小礼物
                    寄送哦。
掌星 zhangxing.info

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


在iphone或者ipad开发的过程中,我们经常需要使用一些需要在全局共享的资源或者需要在多个页面共享的资源,比如某个应用的客户端需
要有一个登陆功能,在用户登陆后需要记住用户的用户名(假定用户的名字是旺财”,在登陆之后的每个页面中里都会在顶部显示一段 “你
好, 旺财”的字样。 当然了,这个简单的小功能实现起来应用非常容易,也有很多的实现方法,对objective-c这样面向对象的程序语言来
说,选用单例模式进行开发是非常方便,且容易实现的。这里我们就针对这个简单的小例子来说明一下单例模式在ios平台下的使用实例,并
在后面介绍一下如何将单例变量中的变量保存到磁盘上,供下次进入的时候使用。这个方式也是我们近期的几个项目里应用到的。
我们的目标就是建立一个小的应用,实现程序的登陆功能,并且在登陆成功之后将用户名称记录在内存中,供我们的程序在后面的页面中调
用,然后进一步扩展,将用户名同时记录在文件中,当用户下次再次启动这个应用的时候,在登陆页面默认在用户名的输入框中显示用户的
名称。
首先建立页面, 启动XCode 新建一个工程命名为 SingletonDemo, 在SingletonDemoViewController.xib中拖入输入框,以及确认按钮,
在代码中生命对应的属性和方法, 用户名输入框为 usernameTextField, 密码未 passwordTextField; 对应的登陆按钮touch down信号的响
应方法为 performLogin: 下面是对应的代码
在 SingletonDemoViewController.h ,增加
掌星 zhangxing.info

在 SingletonDemoViewController.m 中增加   实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和
                                      一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名
                                      称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引
                                      用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类
                                      保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他
                                      处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通
                                      过该类提供的静态方法来得到该类的唯一实例。




                                      这里我们采用这篇文章中介绍的方法:
                                      http://www.numbergrinder.com/2008/12/patterns-in-objective-
                                      c-singleton-pattern/



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


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

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


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

Singleton.h
掌星 zhangxing.info

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


 在 SingletonDemoViewController.m 的 performLogin: 里面加
 入登陆的代码,由于是一个demo,这里我们只做一个简单的验证,
 我们不管用户名输入什么,只要密码是 wangwang 的用户为合法
 的用户:
                                                       这里注意在需要调用Singleton类的文件中需要
                                                       #import "Singleton.h"

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

                                                       其实思路比较简单,就是在Singleton类中实现 -
                                                       commit 方法,将需要序列化的内容写入文件即可,
                                                       当然写入文件的方法有很多种,比如配置相关的内
                                                       容,就可以通过 NSUserDefaults 来保存,在我开发
                                                       的项目里面,为了保存的路径比较灵活,我通常使用
                                                       NSMutableDictionary 的writeToFile 和
                                                       dictionaryWithContentsOfFile 实现文件的保存和
 这里我们使用了一个ContentViewController 建立了内容页面,内容页面           读取。代码如下
 的内容可以自己定制,当然,为了展示下我们的单例类的使用,我们可以
 在ContentViewController的里建立一个UILabel , 然后在载入的时候显示
 “你好,XXX”


 这里是对应的代码:
掌星 zhangxing.info

 Singleton.m中增加
掌星 zhangxing.info

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




 在 SingletonDemoViewController.m 的viewDidLoad中增加




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

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

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



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



正传
建立工程

  首先,打开你的xcode, 新建一个名为 myTableViewWithNib的工程(基于window-based Application).
  新建一个 名为 MyTableViewController 的类.
  默认的 MyTableViewController 实现的是 UITableViewCell , 将他修改成 UITableViewController
掌星 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 {   @property(nonatomic,retain) UITableViewCell* nameCell;
       IBOutlet UITableViewCell* nameCell;                    @property(nonatomic,retain) UITableViewCell* ageCell;
       IBOutlet UITableViewCell* ageCell;                     @property(nonatomic,retain) UITableViewCell* companyCell;
       IBOutlet UITableViewCell* companyCell;
                                                              @property(nonatomic,retain) UITextField* name;
        IBOutlet UITextField* name;                           @property(nonatomic,retain) UITextField* age;
        IBOutlet UITextField* age;                            @property(nonatomic,retain) UITextField* company;
        IBOutlet UITextField* company;
        IBOutlet UILabel *namLable;                           @property(nonatomic,retain) UILabel *namLable;
        IBOutlet UILabel *ageLable;                           @property(nonatomic,retain) UILabel *ageLable;
        IBOutlet UILabel *companyLable;                       @property(nonatomic,retain) UILabel *companyLable;

 }
掌星 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;
 }
掌星 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
掌星 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;
掌星 zhangxing.info

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



 好了,我们的工作完成了,build一下看看效果吧
掌星 zhangxing.info

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


   一般情况下,在 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 类声明中添加如下新属性和动作:
掌星 zhangxing.info

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




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




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

     •   编辑 AutoResizeViewController.h,在 AutoResizeViewController 类声明中添加该方法的声明:
掌星 zhangxing.info
    •   编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加该方法的实现:




    •   修改 viewDidLoad 方法,增加对 resizeUI 方法的调用,以便在初始化视图后正确调整控件尺寸:
•   向 toggleText 方法增加切换长短文本的逻辑:
http://zhangxing.info

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

Más contenido relacionado

La actualidad más candente (11)

Kissy design
Kissy designKissy design
Kissy design
 
前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練
 
Spring框架
Spring框架Spring框架
Spring框架
 
程式人雜誌 2015年三月
程式人雜誌 2015年三月程式人雜誌 2015年三月
程式人雜誌 2015年三月
 
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典
 
Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門
 
Java代码编写的30条建议
Java代码编写的30条建议Java代码编写的30条建议
Java代码编写的30条建议
 

Destacado

Maialen,maider,clara o galzorian dauden animaliak
Maialen,maider,clara o galzorian dauden animaliakMaialen,maider,clara o galzorian dauden animaliak
Maialen,maider,clara o galzorian dauden animaliak
xarpati
 
Videofied frontel presentation_greek
Videofied frontel presentation_greekVideofied frontel presentation_greek
Videofied frontel presentation_greek
Ilias Varsamis
 
David eta Aitor
David eta AitorDavid eta Aitor
David eta Aitor
xarpati
 
Susana power point
Susana power pointSusana power point
Susana power point
xarpati
 
Ugal aparatua
Ugal aparatuaUgal aparatua
Ugal aparatua
xarpati
 
Ander e.
Ander e.Ander e.
Ander e.
xarpati
 

Destacado (9)

Html5 test
Html5 testHtml5 test
Html5 test
 
Yari
YariYari
Yari
 
Maialen,maider,clara o galzorian dauden animaliak
Maialen,maider,clara o galzorian dauden animaliakMaialen,maider,clara o galzorian dauden animaliak
Maialen,maider,clara o galzorian dauden animaliak
 
Videofied frontel presentation_greek
Videofied frontel presentation_greekVideofied frontel presentation_greek
Videofied frontel presentation_greek
 
David eta Aitor
David eta AitorDavid eta Aitor
David eta Aitor
 
Susana power point
Susana power pointSusana power point
Susana power point
 
A&s december 2009
A&s december 2009A&s december 2009
A&s december 2009
 
Ugal aparatua
Ugal aparatuaUgal aparatua
Ugal aparatua
 
Ander e.
Ander e.Ander e.
Ander e.
 

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

Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 
掌星 移动互联网开发笔记-Vol002
掌星 移动互联网开发笔记-Vol002掌星 移动互联网开发笔记-Vol002
掌星 移动互联网开发笔记-Vol002
rainx1982
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
Wade Huang
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
ruandao
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
evercislide
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
liuts
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Chui-Wen Chiu
 

Similar a 掌星 移动互联网开发笔记-Vol001 (20)

Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
掌星 移动互联网开发笔记-Vol002
掌星 移动互联网开发笔记-Vol002掌星 移动互联网开发笔记-Vol002
掌星 移动互联网开发笔记-Vol002
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
Uliweb设计分享
Uliweb设计分享Uliweb设计分享
Uliweb设计分享
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013
 
N bear
N bearN bear
N bear
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 

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

  • 1. 掌星 移动互联网开发笔记 vol 1 封面图片来源:Seven Pillars Lord Abbaddon ,CC授权
  • 2. 掌星 zhangxing.info 目录 - 刊首语 - 征稿 - 在IOS项目开发中使用单例 类共享应用配置信息 - 基 于 xib 的 tableViewCell 的个性化定制 - 一种让UILabel自适应内容 大小的方法
  • 3. 掌星 zhangxing.info 刊首语 这是一个颠覆的时代,移动互联网正改变着我们 的生活方式,也改变着开发者的开发方向,愤怒 的小鸟成功的故事也让无数的开发者进入移动互 联网开发领域,你准备好了没? 《掌星-移动互联网开发笔记》是致力于普及和推 广移动互联网开发技术免费电子文档,虽然看起 来目前还很简陋,但我们不断努力完善,和中国 的无线互联网一同发展,希望大家多多支持。
  • 4. 掌星 zhangxing.info 征 不管您是经验丰富的移动互联网开发人员,还 是初涉移动互联网的菜鸟开发者,不管你是从事 稿 ipad, iphone,android, htm5开发, windows phone, webos, blackberryos, j2me 等平台开发,只要你觉得你自己的开发经验是对 别人有帮助的,都可以投稿给《掌星》,我们的 ! 定位是技术笔记,不需要文章有华丽得辞藻或者 多么高深的技术,只要是你在日常得项目中过的 内容和技术即可。 ! 投稿可以发邮件给 rainx@zhangxing.info, 最 好附赠您得联系方式,姓名和所在的公司,文章 ! 采用后我们会注明您的版权信息,并且有小礼物 寄送哦。
  • 5. 掌星 zhangxing.info 在IOS项目开发中使用单例类共享应用配置信息 作者:RainX (北京掌览天下信息科技有限公司) 在iphone或者ipad开发的过程中,我们经常需要使用一些需要在全局共享的资源或者需要在多个页面共享的资源,比如某个应用的客户端需 要有一个登陆功能,在用户登陆后需要记住用户的用户名(假定用户的名字是旺财”,在登陆之后的每个页面中里都会在顶部显示一段 “你 好, 旺财”的字样。 当然了,这个简单的小功能实现起来应用非常容易,也有很多的实现方法,对objective-c这样面向对象的程序语言来 说,选用单例模式进行开发是非常方便,且容易实现的。这里我们就针对这个简单的小例子来说明一下单例模式在ios平台下的使用实例,并 在后面介绍一下如何将单例变量中的变量保存到磁盘上,供下次进入的时候使用。这个方式也是我们近期的几个项目里应用到的。 我们的目标就是建立一个小的应用,实现程序的登陆功能,并且在登陆成功之后将用户名称记录在内存中,供我们的程序在后面的页面中调 用,然后进一步扩展,将用户名同时记录在文件中,当用户下次再次启动这个应用的时候,在登陆页面默认在用户名的输入框中显示用户的 名称。 首先建立页面, 启动XCode 新建一个工程命名为 SingletonDemo, 在SingletonDemoViewController.xib中拖入输入框,以及确认按钮, 在代码中生命对应的属性和方法, 用户名输入框为 usernameTextField, 密码未 passwordTextField; 对应的登陆按钮touch down信号的响 应方法为 performLogin: 下面是对应的代码 在 SingletonDemoViewController.h ,增加
  • 6. 掌星 zhangxing.info 在 SingletonDemoViewController.m 中增加 实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和 一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名 称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引 用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类 保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他 处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通 过该类提供的静态方法来得到该类的唯一实例。 这里我们采用这篇文章中介绍的方法: http://www.numbergrinder.com/2008/12/patterns-in-objective- c-singleton-pattern/ 首先介绍一下单例模式本身。 单例模式,也叫单子模式,是一种常用的软件设计模式。 在应用这个模式时,单例对象的类必须保证只有一个实例 存在。许多时候整个系统只需要拥有一个的全局对象,这 样有利于我们协调系统整体的行为。比如在某个服务器程 序中,该服务器的配置信息存放在一个文件中,这些配置 数据由一个单例对象统一读取,然后服务进程中的其他对 象再通过这个单例对象获取这些配置信息。这种方式简化 了在复杂环境下的配置管理。
  • 7. 掌星 zhangxing.info 使用类方法instance返回单例类的实例,其实例保存在类方法 Singleton.m instance 的一个静态局部变量里, 注意这个实现没有完成将构造 函数私有化的功能,因为OC本身对私有化的支持就不是很完善, 所以我们在后续的代码中,需要注意不要直接使用 [[Singleton alloc] init] 来给变量赋值,而需要使用 [Singleton instance] 来 获取对象的实例。 OK,现在单例类的构造方法实现了,我们还需要实现一些逻辑在里 面,根据我们应用的设计,这个单例类主要为了保存应用程序中 用户名的状态,所以我们需要给他增加用户名的属性,添加完成 后的类变为 Singleton.h
  • 8. 掌星 zhangxing.info 有了单例类,我们就可以在我们的代码里面开始应用它 在 SingletonDemoViewController.m 的 performLogin: 里面加 入登陆的代码,由于是一个demo,这里我们只做一个简单的验证, 我们不管用户名输入什么,只要密码是 wangwang 的用户为合法 的用户: 这里注意在需要调用Singleton类的文件中需要 #import "Singleton.h" 有的时候,我们还需要将Singleton中的内容序列化 保存在文件,供下次应用再次被启动时调用(比如关 机后再重启),这里我也简单介绍一下我的实现方 法, 其实思路比较简单,就是在Singleton类中实现 - commit 方法,将需要序列化的内容写入文件即可, 当然写入文件的方法有很多种,比如配置相关的内 容,就可以通过 NSUserDefaults 来保存,在我开发 的项目里面,为了保存的路径比较灵活,我通常使用 NSMutableDictionary 的writeToFile 和 dictionaryWithContentsOfFile 实现文件的保存和 这里我们使用了一个ContentViewController 建立了内容页面,内容页面 读取。代码如下 的内容可以自己定制,当然,为了展示下我们的单例类的使用,我们可以 在ContentViewController的里建立一个UILabel , 然后在载入的时候显示 “你好,XXX” 这里是对应的代码:
  • 10. 掌星 zhangxing.info 这样,在我们的程序例,在 performLogin: 里面加入一行 在 SingletonDemoViewController.m 的viewDidLoad中增加 既可以实现用户输入框的记住密码功能了。 由于IOS的SDK里面没有类似android的adk里的 android.app.Application 类实现 ApplicationContext ,或者Intent类实现页面 信息传递,所以我们大量的应用单例类来实现程序状态信息的传递和保存。OK..Singleton在我们项目中的用法就介绍到这里了。
  • 11. 掌星 zhangxing.info 基于xib的tableViewCell的个性化定制 作者:侯波林 (北京掌览天下信息科技有限公司) 简介 在iphone或者ipad开发中,我们经常会用到tableview,以及一些个性化的 TableViewCell. 但在代码中对tableViewCell的调整往往效率比较 低下,如果能在图形界面进行cell的调整,对我们的开发效率将会是很大的提高. 今天我将为大家介绍一下 基于interface Builer的 tableViewCell的开发. 我们的目标是展现一个 tableView, view中有三个cell,分别展示 姓名,年龄,单位. 话不多说,让我们进入 tableView的奇 妙旅程吧. 正传 建立工程 首先,打开你的xcode, 新建一个名为 myTableViewWithNib的工程(基于window-based Application). 新建一个 名为 MyTableViewController 的类. 默认的 MyTableViewController 实现的是 UITableViewCell , 将他修改成 UITableViewController
  • 12. 掌星 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 { @property(nonatomic,retain) UITableViewCell* nameCell; IBOutlet UITableViewCell* nameCell; @property(nonatomic,retain) UITableViewCell* ageCell; IBOutlet UITableViewCell* ageCell; @property(nonatomic,retain) UITableViewCell* companyCell; IBOutlet UITableViewCell* companyCell; @property(nonatomic,retain) UITextField* name; IBOutlet UITextField* name; @property(nonatomic,retain) UITextField* age; IBOutlet UITextField* age; @property(nonatomic,retain) UITextField* company; IBOutlet UITextField* company; IBOutlet UILabel *namLable; @property(nonatomic,retain) UILabel *namLable; IBOutlet UILabel *ageLable; @property(nonatomic,retain) UILabel *ageLable; IBOutlet UILabel *companyLable; @property(nonatomic,retain) UILabel *companyLable; }
  • 13. 掌星 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; }
  • 14. 掌星 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
  • 15. 掌星 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;
  • 17. 掌星 zhangxing.info 一种让UILabel自适应内容大小的方法 作者:Chaoslawful (淘宝北京) 一般情况下,在 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 类声明中添加如下新属性和动作:
  • 18. 掌星 zhangxing.info • 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加如下实现代码: • 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加如下实现代码: 下面是重头戏出场,我们将计算 UILabel 的合适外框尺寸并调整 UILabel 和 UIButton 的位置和大小的功能抽离为一个名为 resizeUI 的方法,这样在任何更改了 UILabel 文本的地方简单地调用 resizeUI 方法,即可更新界面布局: • 编辑 AutoResizeViewController.h,在 AutoResizeViewController 类声明中添加该方法的声明:
  • 19. 掌星 zhangxing.info • 编辑 AutoResizeViewController.m,在 AutoResizeViewController 类实现中添加该方法的实现: • 修改 viewDidLoad 方法,增加对 resizeUI 方法的调用,以便在初始化视图后正确调整控件尺寸:
  • 20. 向 toggleText 方法增加切换长短文本的逻辑: