3.2 应用剖析 这一节我们从应用的类图如入手,了解应用中有哪些类,以及这个类中的方法、成员变量和属性。nib 文件有哪些。还会介绍MVC 设计模式等。 3.2.1 核心类图 在该应用中涉及到9 个类,1 个协议如图3-8 所示。
3.2.2 RootViewController类 RootViewController 是根控制器,它控制其它的视图控制器。RootViewController 类中的成员变量和方法如表3-2 所示: 表3-2 RootViewController 类表
其中 按钮的IBOutlet (输出口)变量是infoButton ,在Cocoa 编程中一个控件是否定义输出口是要看这个控件是否需要通过程序代码改变它的状态,例如:如果我们需要在控制器中改变按钮的背景或文字,我们就需要为该按钮控件定义输出口。 3.2.3 MainViewController类 MainViewController 是主视图控制器,MainViewController 类中的成员变量和方法如表3-3 所示: 表3-3 MainViewController 类表
![8_47717_655f3f518ef3c0d.jpg](http://cc.cocimg.com/bbs/p_w_upload/thumb/Fid_8/8_47717_655f3f518ef3c0d.jpg)
图3-8 核心类图
在类图其中有3 个是Cocoa Touch 提供的基类,即:UIViewController 、UIView 和NSObject ,其它的6 个类由我们编写。还有1 个协议UIApplicationDelegate 。 这些类和协议的作用如表3-1 所示: 表3-1 类和协议表 类名或协议 | 作用 | 备注 |
UIViewController | 视图控制器基类 | 基类 |
UIView | 视图基类 | 基类 |
NSObject | Objective-C根类 | 基类 |
RootViewController | 应用中的根控制器 | 应用程序类 |
MainViewController | 主视图的视图控制器 | 应用程序类 |
FlipsideViewController | 背后视图的视图控制器 | 应用程序类 |
MainView | 主视图的视图 | 应用程序类 |
FlipsideView | 背后视图的视图 | 应用程序类 |
UIApplicationDelegate | 应用程序委托协议 | 协议 |
PasswordGenAppDelegate | 应用程序委托 | 应用程序委托 |
类成员 | 变量或方法类型 | 类型或返回类型 | 说明 |
infoButton | 成员变量 | IBOutlet UIButton* | 定义有输出口的按钮 |
flipsideNavigationBar | 成员变量 | IBOutlet UINavigationBar* | 背后视图的导航栏 |
mainViewController | 成员变量 | IBOutlet MainViewController* | 主视图控制器 |
flipsideViewController | 成员变量 | IBOutlet FlipsideViewController* | 背后视图控制器 |
viewDidLoad | 方法 | void | 视图加载完成回调方法 |
dealloc | 方法 | void | 对象释放回调方法 |
didReceiveMemoryWarning | 方法 | void | 内存报警时候回调方法 |
shouldAutorotateToInterfaceOrientation | 方法 | BOOL | 视图控制器支持某个方向旋转时候返回YES |
toggleView | 方法 | IBAction | 点击按钮或Done按钮时候调用 |
loadFlipsideViewController | 方法 | void | 初始化背后视图控制器 |
类成员 | 变量或方法类型 | 类型或返回类型 | 说明 |
createPassword | 成员变量 | IBOutlet UIButton* | 定义有输出口的[color=windowtext ]Generate Password按钮 |
emailPassword | 成员变量 | IBOutlet UIButton* | 定义有输出口的E-Mail Password按钮 |
viewDidLoad | 方法 | void | 视图加载完成回调方法 |
dealloc | 方法 | void | 对象释放回调方法 |
didReceiveMemoryWarning | 方法 | void | 内存报警时候回调方法 |
shouldAutorotateToInterfaceOrientation | 方法 | BOOL | 视图控制器支持某个方向旋转时候返回YES |
定义有输出口的Generate Password 和E-Mail Password 按钮定义输出口是因为需要在控制器的viewDidLoad 方法初始化这两个按钮状态。
3.2.4 FlipsideViewController类 FlipsideViewController 是背后视图控制器,FlipsideViewController 类中的成员变量和方法如表3-4 所示: 表3-4 FlipsideViewController 类表
3.2.5 MainView类 MainView 是主视图,MainView 类中的成员变量和方法如表3-5 所示: 表3-5 MainView 类表
emailAddress 成员变量,但是从来没有使用过!还有比较严重的问题是,在该类中没有重写dealloc 方法,该方法是对象释放回调方法,在该方法中用来释放类中的成员变量,代码如下: - (void)dealloc { [passwordrelease]; … … [superdealloc]; } dealloc 非常重要,特别是有很多成员变量需要释放内存时候,而在该类中没有重写这个方法,这也是我们应该摒弃和借鉴的。 3.2.6 FlipsideView类 FlipsideView 是背后视图,FlipsideView 类中的成员变量和方法如表3-6 所示: 表3-6 FlipsideView 类表
3.2.7 Nib文件 本应用中的nib 文件有3 个:MainWindow.xib 、MainView.xib 和FlipsideView.xib ,这3 个文件解释如下: · MainWindow.xib ,在主窗口nib 文件,默认Cocoa 应用都有这个文件,主程序在启动的时候读取这个文件,根据这个文件配置信息启动相应的根控制器。 · MainView.xib ,是主视图的nib 文件,它是MainViewController 和MainView 的纽带。 · FlipsideView.xib ,是主视图的nib 文件,它是FlipsideViewController 和FlipsideView 的纽带。 & 文件的后缀名是xib 为什么nib 文件?以前该文件的后缀名是nib ,官方一致延续了nib 的叫法。因此,在本书中也采用nib 的叫法。 3.2.8 Cocoa和Cocoa Touch中MVC设计模式 从上面的介绍看到应用中有很多的UIViewController 和UIView ,还有很多nib 文件,它们之间是什么关系呢?这与MVC 设计模式有关。 苹果的Cocoa 和Cocoa Touch 采用了MVC 设计模式进行设计的,所谓设计模式就是解决某一特定问题的方案。MVC 是解决具有UI 的应用系统的成熟解决方案,MVC 解释如下: · M -Model (模型)是应用系统中与视图对于部分的数据; · V -View (视图)是应用系统中用户看到并与之交互的界面; · C -Controller (控制器)是应用系统中起到控制器作用,接受用户事件,显示数据等等,与视图进行交互等。 & Cocoa 是苹果开发Mac OS X 应用系统的框架,它是基于Objective-C ,它包括:Foundation 和AppKit ,Cocoa 框架在iOS 上叫做Cocoa Touch ,Cocoa Touch 框架包含:Foundation 和UIKit 。 在Cocoa 和Cocoa Touch 应用中严格按照该模式实现如图3-9 所示。在Cocoa 和Cocoa Touch 中除了视图和视图控制器外,还有nib 文件,nib 文件是通过Interface Builder 工具维护,在新版的Xcode 4.x 后Interface Builder 与Xcode 集成在一起了,本书采用的还是Xcode3.2 版本,因此Interface Builder 与Xcode 工具还是分开的。
图3-9 Cocoa MVC nib 文件是视图和控制器的“纽带”,如图3-10 所示,通过这个“纽带”控制器能够控制在视图上显示和读取内容,能够接受和响应视图上的事件。我们也可以通过nib 文件可视化地设计视图。
图3-10 nib 文件 无论从图3-9 还是图3-10 我们都没有发现Model (模型)的“痕迹”,在一般的简单控件中模型类不是很突出,它可以是简单数据类型,也可以是NSString 等Objective-C 中的类,也可以是我们自定义一些类,它们可以以成员变量的方式出现在视图控制器中,也可以以成员变量的方式出现在视图中。因此,模型可以很灵活的出现,而控制器和视图是很明显的,一般而言一个控制器可以控制多个视图。
类成员 | 变量或方法类型 | 类型或返回类型 | 说明 |
viewDidLoad | 方法 | void | 视图加载完成回调方法 |
dealloc | 方法 | void | 对象释放回调方法 |
didReceiveMemoryWarning | 方法 | void | 内存报警时候回调方法 |
shouldAutorotateToInterfaceOrientation | 方法 | BOOL | 视图控制器支持某个方向旋转时候返回YES |
类成员 | 变量或方法类型 | 类型或返回类型 | 说明 |
passwordLength | 成员变量 | IBOutlet UITextField* | 定义有输出口的密码长度文本框 |
includeLowerCase | 成员变量 | IBOutlet UISwitch* | 定义有输出口的包含小写开关控件 |
includeNumbers | 成员变量 | IBOutlet UISwitch* | 定义有输出口的包含数字开关控件 |
includePunctuation | 成员变量 | IBOutlet UISwitch* | 定义有输出口的包含标点符号开关控件 |
includeUpperCase | 成员变量 | IBOutlet UISwitch* | 定义有输出口的包含大写开关控件 |
showPhonetics | 成员变量 | IBOutlet UISwitch* | 定义有输出口的是否显示发音开关控件 |
password | 成员变量 | IBOutlet UITextField* | 定义有输出口的密码文本框 |
phoneticPassword | 成员变量 | IBOutlet UITextView* | 定义有输出口的显示发音文本视图 |
emailPasswordButton | 成员变量 | IBOutlet UIButton* | 定义有输出口的发送email按钮 |
setPasssword | 方法 | IBAction | 点击Generate Password按钮时候调用 |
resignResponder | 方法 | IBAction | 放弃密码文本框和密码长度文本框的第一响应者 |
emailPassword | 方法 | IBAction | 点击E-Mail Password按钮时候调用 |
类成员 | 变量或方法类型 | 类型或返回类型 | 说明 |
dealloc | 方法 | void | 对象释放回调方法 |
initWithFrame: | 构造方法 | id | 视图的构造方法 |
drawRect: | 方法 | void | 绘制视图方法,本应用实际没有使用 |
openLink | 方法 | IBAction | 点击Download按钮时候调用 |
![8_47717_47e0308dffba9db.jpg](http://cc.cocimg.com/bbs/p_w_upload/thumb/Fid_8/8_47717_47e0308dffba9db.jpg)
![8_47717_06dec67d6709bc7.jpg](http://cc.cocimg.com/bbs/p_w_upload/thumb/Fid_8/8_47717_06dec67d6709bc7.jpg)