什么是Nib文件

一. 什么是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


2.2 加载其他的Nib文件
       Mac OS X可以使用NSWindowController 的- (id)initWithWindowNibName:(NSString *)windowNibName(或者此方法变种)加载Nib文件。
        iOS可以使用UIViewController的- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle加载Nib文件。

   示例:Mac OS X加载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,setOutletName:,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接口对象来存储顶层对象的引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值