Author:quietwalk
Date:2010-10-16
模型对象表示数据。
视图对象知道如何显示数据(模型),并且它们有可能会允许用户对数据进行编辑。
控制器对象位于模型和视图之间。
Interface Builder 用于创建并配置 nib 文件。
Interface Builder 文档包含四个对象:
(1)文件拥有者代理对象。实际上,文件拥有者对象是 视图控制器实例(MyViewController实例)也可以认为是应用程序实例(UIApplication实例)。
(2)第一响应者代理对象。
(3)应用程序的委托,文件名为“YourAppName+AppDelegate”。
(4)一个窗口。
插座变量(outlet):视图控制器中定义的变量。在视图控制器中定义变量之后,同进也会在IB的文档所有者中有所体现,前面已说了,IB的文档所有者其实就是Xcode 中的视图控制器类。
Interface Builder 创建用户接口。Interface Builder 创建用户接口
“.nib”: “NextStep Interface Builder”的首字母缩写。程序运行时会加载 nib 文件,解档文件中的对象并且将其恢复到被保存至文件那一瞬间的状态-包括对象间的所有关联。
XIB 文件:含三个对象,文件拥有者代理、第一响应者代理、视图。
文件的拥有者: 视图控制器实例。
identity:属性,特性。
视图插座变量:文件与视图的关联。
Inspector:检查员
Interface Builder 包含一个对象库,可以将其中的对象添加至 nib 文件。
Capitalize:大写字母
IBOutlet是一个特殊的关键字,它唯一的作用是通知 Interface Builder 将某个实例变量或者属性当成插座变量。实际上,这个关键字被定义为空白,因此在编译的时候它没有任何作用。
IBAction 是一个特殊的关键字,它唯一的作用是告诉 Interface Builder 将某个方法当成目标/动作关联中的动作。它被定义为 void。
在视图控制器中定义变量,相关于在界面的设计部分类中定义控件变量;
在视图控制器类的接口中添加了实例变量和属性声明,方法的声明;在视图控制器类实现中添加方法的存根实现。
initWithFormat:@"Hello, %@!", nameString
initWithFormat:方法符串按照格式化字符串所指定的格式创建一个新
字符串。%@表明此处应该使用一个字符串对象来代替。
Xcode工作空间指南
iphone 应用程序编程指南
iphone 开发指南
制定关联:关联标签和文本字段的插座变更。从文件拥有者到视图控件。
按下 Contrl 键并点击文件拥有者,一个半透明的面板就会显示出来,面板里面显示了所有可用的插座变量和动作。请将光标从列表右边的圆圈拖动到所要关联的视图项上面,这样就可以建立二者之间的关联。
1、新建工程:
步骤:启动 Xcode(缺省情况下,Xcode 位于 /Developer/Applictions里面),选择 File > New >Project,选中 Window-Based Application 并点击 Choose 按键,选择一个合适的位置(例如您可以放在桌面也可以放在一个定制的工程目录),然后为工程添加一个名称—HelloWorld—再点击保存按键。
2、添加一个视图控制器类。
说明:负责管理一个视图(定制应用程序的行为)。在 iPhone上,它们也帮助进行导航和内存管理。UIKit提供一个特别的类 — 即 UIViewController类—它封装了视图控制器应该具有的大部分缺省行为。从它派生子类,在子类中定制应用程序的行为。
步骤:
(1) 者选中 Classes 文件夹;
(2) 请选择 File > New File;
(3) 请选择 Cocoa Touch Classes;
(4) 选择UIViewController subclass,同时,请勾选 Options 区域中标题为 With XIB for user interface 的选择框。
(5) 点击 Next,在其后出现的屏幕中为文件起个名字,例如 MyViewController。
(6) 点击 Finish,文件会被添加到工程。
3、在 应用程序委托类头文件 中添加一个视图控制器实例并为其添加属性(即“HelloWorldAppDelegate.h”文件中)
说明:将视图控制器作为应用程序委托的一个实例变量。添加到应用程序委托的实例变量是 MyViewController类的实例。
步骤:
(1)前向声明视图控制器:在应用程序委托头文件(HelloWorldAppDelegate.h)的接口声明前面-即
HelloWorldAppDelegate声明前面-添加前向声明“@class MyViewController;”;
(2)添加视图控制器实例变量:
说明:在应用程序委托头文件中为视图控制器类添加一个实例变量;
步骤:在头文件大括号之间添加“MyViewController *myViewController;”;
(3)添加视图控制器实例变量属性:
说明:实例含有一个属性,可以使用 getter 和 setter 方法—即
“myViewController”和 “setMyViewController:”方法—来访问该属性,同时,委托实例还会保持该属性。
步骤:在应用程序委托头文件大括号之后 @end之前添加下面的属性声明:
“@property (nonatomic, retain) MyViewController *myViewController;”;
4、在 应用程序委托类实现文件 中创建视图控制器实例(即“HelloWorldAppDelegate.m”文件中)
说明:步骤3已经把视图控制器实例添加到应用程序的委托,现在需要实际创建一个视图控制器实例,并将其设置为属性的值。
步骤:在applicationDidFinishLaunching:方法开头添加如下代码,这些代码用于创建一个MyViewController实例:
MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[self setMyViewController:aViewController]; 这行等同于上一行。
[aViewController release];
代码说明:
(1) 创建并初始化一个视图控制器类的实例。
先使用 alloc方法创建一个视图控制器,然后用 initWithNibName:bundle:方法对其进行初始化。
(2) 使用存取方法将新建的视图控制器是设置为 myViewController实例变量值。
(3) 没有单独声明 setMyViewController:方法,而是隐式将其作为属性声明的一部分。
(4) 依照内存管理规则释放视图控制器。第三行调用 release方法以放弃对所创建对象的拥有权。
5、在 应用程序委托类实现文件 中建立视图(即“HelloWorldAppDelegate.m”文件中)
说明:视图控制器负责管理和配置视图。您并不直接创建窗口的内容视图,而是从视图控制器获取,并将其添加成窗口子视图。
步骤:在4中释放视图控制器之后添加:
UIView *controllersView = [myViewController view];
[window addSubview:controllersView];
代码说明:建立视图并返回给窗口。
之后,IDE添加代码“[window makeKeyAndVisible];”将窗口(现已含有您的视图)显示在屏幕上。
6、内务处理
(1)在 应用程序委托类的实现文件 中导入视图控制器头文件
方法:在“HelloWorldAppDelegate.m”中导入#import "MyViewController.h"
(2)在 应用程序委托类的实现文件 中为视图控制器合成存取方法
步骤:在应用程序委托类的实现文件的 @implementation代码块中通知编译器为视图控制器合成存取方法“@synthesize myViewController;”
(3)释放视图控制器
步骤:在 dealloc方法起始处释放视图控制器“[myViewController release];”。
7、设置视图背景:
(1)在 Interface Builder 中选择视图,然后选择 Tools > Attributes Inspector ,这样屏幕就会显示Attributes inspector。
(2)点击 Background 选色板上的方框,让颜色面板显示在屏幕上。然后在其中选择一种不同的颜色。
(3)保存 nib 文件。
8、添加用户接口元素
在视图窗口中添加TextBox 、Label、Button 等界面元素。
9、在 视图控制器头文件 中添加8对应的变量
说明:建立视图控制器到用户接口的关联
UITextField *textField;
UILabel *label;
NSString *string;
在视图控制器中定义变量之后,同进也会在IB的文档所有者中有所体现。
10、在 视图控制器头文件 为9中定义的变量添加属性声明及要使用的方法
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) NSString *string;
- (IBAction)changeGreeting:(id)sender;
最后一行是声明了一个方法。
代码说明:
(1) IBOutlet是一个特殊的关键字,它唯一的作用是通知 Interface Builder 将某个实例变量或者属性当成插座变量。实际上,这个关键字被定义为空白,因此在编译的时候它没有任何作用。
(2) IBAction 是一个特殊的关键字,它唯一的作用是告诉 Interface Builder 将某个方法当成目标/动作关联中的动作。它被定义为 void。
(3) 视图控制器还作为界面控件的委托。
11、在 视图控制器实现文件 中为在头文件中定义的方法做出实现
12、制定关联
前提:已经定义了视图控制器的插座变量和动作;
建立关联的地方:nib 文件中。
(1) 关联标签和文本字段的插座变更。
From:文件所有者;
To:视图控件。
方法:按下 Contrl 键并点击文件拥有者,一个半透明的面板就会显示出来,
面板里面显示了所有可用的插座变量和动作。将光标从列表右边的圆圈拖动到所要关联的视图项上面,这样就可以建立二者之间的关联。
(2) 事件响应(以按钮的点击事件为例):
From:视图中控件;
To:文档所有者。
方法:按下 Control 键并点击视图中的按键,在随后出现的查看器中,将光标从事件列表 Touch Up 项的开口圆圈拖动到文件拥有者的图标。待文件拥有者上面出现一个半透明面板后,选择其中的 changeGreeting:方法(此方法已定义)。
13、实现 视图控制器 类
说明:实现视图控制器要做三件事。要对实例变量作一些处理,包括内存管理方面的处理;需要实现changeGreeting:方法;需要确保用户点击 Done 按键的时候,键盘会消失。
(1)为视图控制器中的 变量 合成存取方法
首先要让编译器合成存取方法。
>> 在 MyViewController.m文件的@implementation MyViewController后面添加下列代码:
@synthesize textField;
@synthesize label;
@synthesize string;
(2)管理 视图控制器 中的 变量 内存
方法:更新 MyViewController.m文件中的 dealloc方法,让它在调用父类的实现之前先释放实例变量:
- (void)dealloc {
[textField release];
[label release];
[string release];
[super dealloc]; //调用父类的实现之前
}
(3)实现 视图控制器 中定义的方法,使其完成一定的工作
- (IBAction)changeGreeting:(id)sender {
self.string = textField.text;
NSString *nameString = string;
if ([nameString length] == 0) {
nameString = @"World";
}
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
label.text = greeting;
[greeting release];
}