在这一章将从Foundation Kit框架转移到Application Ki框架,来创建一个可以用于Mac的桌面程序
一、构建项目
进入Xcode,创建一个新Cocoa Application项目,从File菜单选择New Project,选择Cocoa Application,并输入新项目的名称
接下来在建好的项目中添加新的Objective-C类文件,起名字,并确保选中了Also create AppController.h复选框
二、构建AppController @interface
我们将使用Interface Builder来布局窗口内容,在AppController于用户界面控件之间进行各种连接
#import <Cocoa/Cocoa.h>
@interfaceAppController : NSObject {
IBOutlet NSTextField *textField; //NSTextField文本标签类 textField对象是要输入转换字符串的地方
IBOutlet NSTextField *resultsField; //resultsField是转换完显示结果的地方
}
-(IBAction)uppercase:(id)sender; //转换大写方法,需获取参数sender(点击的NSButton对象)
-(IBAction)lowercase:(id)sender;
@end//Appcontroller
两个类似的关键字IBOutlet 和 IBAction,他们实际上只是AppKit提供的#definesIBOutlet的定义没有任何作用,因此不会对他进行编译
IBAction定义为void,这意味着在AppController中声明的方法的返回类型是void,即什么都不返回
IBOutlet 和 IBAction实际上是为Interface Builder以及阅读代码的人提供的标记。通过查找IBOutlet 和 IBAction,Interface Builder知道AppController对象具有两个能够连接的实例变量,这两个方法作为单击按钮的目标
三、Interface Builder
双击项目中的MainMenu.xib文件,这个文件配备了一个菜单栏,以及一个可以加入用户控件的窗口
xib文件旧称nib 是NeXT Interface Builder的缩写,nib文件是包含被冻结的对象的二进制文件
xib文件是XML格式的nib文件,在编译时,xib文件将编译为nib格式
下图是双击后的界面
Interface Builder打开后有5个窗体出现
1、固定窗体,表示nib文件的内容图标,这是nib文件的主窗口
2、应用程序的菜单栏,可以添加新菜单和菜单项,也可以编辑现有菜单项
3、空窗体,主要编辑区域,其内容与固定窗体1中的图标相对应
4、IB Library,包含可以拖到窗口的对象
5、属性调节面板,顾名思义调节属性用的
接下来开始构建窗体
目的:要告诉Interface Builder创建一个AppController对象,即当程序运行时Cocoa加载nib文件会生成一个
AppController对象
1、将一个NSObject从库面板拖拽到MainMenu.xib固定窗口中,他在库面板中显示名称为Object
2、在选中固定窗口中刚刚拖拽的Object后,选择菜单栏Tool > Identity Inspector(快捷键6),打开检查器窗口,在其中将类更改为AppController,更改后固定窗口中Object已经改变为AppController
四、布局用户界面
1、在库中找到TextField,拖拽到窗口中(一下步骤和C#太像了,不再贴图)
2、拖拽一个Label
3、拖拽一个Button,双击按钮编辑其标签为UpperCase
4、拖拽一个Button,双击按钮编辑其标签为LowerCase
最后调整一下如下图效果
五、连接
1、连接输出口
(1)选择固定窗口中的AppController,按下Control键并从AppController拖到文本域,鼠标所过之处会出现一条美丽的蓝线,拖到文本域时会出现TextField标签
(2)、释放鼠标,将显示一个包含可能的IB输出口的菜单,选择textField
(3)、按住Control从AppController拖到Label,选择resultsField完成连接
(4)、选择检查器的Connections面板或使用快捷键5,查看是否连接成功
2、连接操作
选择Button按住Control并拖动鼠标连接到AppController,释放鼠标后选择要连接的方法
Tip:拖动方向的原则--从需要知道某些内容的对象到该对象需要了解的对象
例如:AppController需要知道将那个NSTextField用于用户输入,因此拖动方向是从App到文本域
按钮需要知道告诉哪个对象有人按他,因此从按钮拖到AppController
六、AppController实现
一定要先保存nib文件
程序工作原理描述:
1、当加载nib文件时,存储在nib文件中的任何对象会被重新创建(即在后台执行alloc和init方法)
2、当程序启动时,会分配并初始化一个AppController实例
3、在初始化期间,所有IBOutlet实例变量都为nil,只有创建了所有nib文件中的对象,连接才算完成
4、一旦建立了连接(即将NSTextField对象的地址添加到AppController的实例变量中),会向创建的每个对象发送awakeFromNib方法,awakeFromNib不存在预定义的顺序
5、因为初始化中所有实例变量都为nil所以在init中调用IBOutlet不会执行任何操作
实现代码:
#import "AppController.h"
@implementationAppController
-(id)init
{
if (self = [super init]) {
NSLog(@"init: text %@ / results %@", //在初始化时显示IBOutlet实例变量的值,用来证明初始化时是nil
textField,resultsField);
}
return(self);
}
-(void)awakeFromNib //awakeFromNib是初始化控件值的最佳方法
{
NSLog(@"awake: text %@ / results %@",
textField,resultsField);
[textField setStringValue:@"Enter text here"]; //初始化控件的文本标签
[resultsField setStringValue:@"Results"]; //初始化控件的文本标签
}//awakeFromNib
-(IBAction)uppercase:(id)sender
{
NSString *original;
original = [textField stringValue]; //stringValue获取对象字符串值
NSString *uppercase;
uppercase = [original uppercaseString]; //调用NSString类的uppercaseString方法
[resultsField setStringValue:uppercase]; //设置文本标签新的值
}//uppercase
-(IBAction)lowercase:(id)sender
{
NSString *original;
original = [textField stringValue];
NSString *lowercase;
lowercase = [original lowercaseString];
[resultsField setStringValue:lowercase];
}//lowercase
@end
下为效果图