一. 什么是Nib文件
Nib文件是保存由Interface Builder创建的对象及对象间关系的一种资源文档。Nib文件中的对象包括:接口对象(可视化对象--窗口,视图,控件,菜单...;非可视化对象--窗口控制器,视图控制器,程序委托代理...)和占位符对象(File's Owner,First Responder,Application)。它描述了对象,以及对象间的关系。对象间的关系包括:连接Nib文件的所有者-File's Owner,属性实例变量绑定,动作方法绑定和委托绑定。当Nib文件被加载后,接口对象被创建,占位符对象并不会被创建。应该在你的代码中创建此占位符对象,并把它传递给nib的加载代码。
主Nib文件--应用程序的信息属性列表文件(Info.plist
)的Main nib file base name键值(Mac OS X默认值-MainMenu,iOS默认值-MainWindow)描述主Nib文件名称,应用程序根据该键值自动加载主Nib文件。
二. 加载Nib文件过程
Nib加载代码读取Nib文件内容和引用的其他资源文件,并根据此Nib文件的描述,创建并初始化对象,建立对象间的连接。
加载Nib文件->创建对象alloc->初始化init->创建对象间的连接->向创建的对象发送消息- (void)awakeFromNib。
在执行初始化init方法期间,所有的IBOutlet实例变量都为nil,只有创建了nib文件中的所有对象(包括窗口、文本编辑框、按钮...),所有连接才算完成。
一旦建立了所有的连接(即对象地址连接到实例变量),会向所有的对象发送消息awakeFromNib。在awakeFromNib方法中,实例变量已连接,实例变量有效。
2.1 加载主Nib文件
2.1.1 NSApplicationMain(argc, (const char **)argv)加载
int main(int argc,const char *argv[])
{
returnNSApplicationMain(argc, (const char **)argv);//通过Info.plist的Main nib file base name键值加载主Nib
}
该方法也是通过NSBundle加载Nib文件。
2.1.2 NSBundle加载
int main(int argc,const char *argv[])
{
@autoreleasepool {
[NSApplicationsharedApplication]; //创建应用程序对象NSApp
[NSBundleloadNibNamed:@"MainMenu"owner:NSApp];//Mac OS X对应MainMenu;iOS对应MainWindow
[NSApprun];
return0;
}
}
2.1.3 NSNib加载
- (id)initWithNibNamed:(NSString *)nibName bundle:(NSBundle *)bundle
- (id)initWithWindowNibName:(NSString *)windowNibName
(或者此方法变种)加载Nib文件。DialogFindController *dlgFindController =
[[DialogFindControlleralloc]initWithWindowNibName:@"DialogFind"];//加载DialogFind.xib
NSWindow *window = [dlgFindControllerwindow];
[dlgFindController showWindow:nil];
[window center]; //居中显示
NSApprunModalForWindow:window];//模态窗口
2.3 初始化init消息
2.3.1 通常情况下,对象收到initWithCoder:消息
Mac OS X系统,views, cells, menus, and view controllers;
iOS系统, 遵守 NSCoding
协议的对象;
2.3.2 从NSView继承的Custom views类
Mac OS X系统,对象收到initWithFrame: 消息;
iOS系统不使用initWithFrame:消息;
2.3.3 其它自定义的对象,接收init消息
2.4 对象间的连接
2.4.1Outlet connections
Mac OS X,
set
OutletName:,KVO
iOS,
setValue:forKey:,KVO
2.4.2Action connections
OS X,
setTarget:
and setAction:
iOS,
bind:toObject:withKeyPath:options:
2.5 发送awakeFromNib消息
OS X, 向所有接口对象,包括占位符对象发送awakeFromNib消息
iOS,只向Nib加载代码创建的对象发送awakeFromNib消息,不向占位符发送消息
三.在Mac OS X中管理Nib对象
a. 主Nib中的顶层对象(即没有父对象),一般包括windows, menubars, custom controller objects。
主Nib中的顶层对象,如下图:
b. File’s Owner, First Responder, Application是占位符对象,不属于顶层对象。
占位符对象如下图:
c. 一般情况下,在Nib的File’s Owner对象中,定义IBOutlet接口对象来存储顶层对象的引用。