iOS Nib文件一览

Nib文件一览
        Interface对象
            Interface对象是添加至Interface Builder文档中实现用户界面的元素。当nib文件在运行时被加载时,Interface对象就是nib加载代码实际创建的对象。
        File's Owner
            File's Owner对象是个代理对象,并不是在nib文件加载时创建,相反,你需要在自己的代码中创建并传递给nib加载的代码。该对象的重要性体现在其为应用程序代码和nib文件内容的主要连接。特别地,其是负责nib文件内容的控制对象。
        First Responder
            First Responder对象是个代理对象,表示应用程序动态确定的响应者链的第一个对象。因为不能在设计时就确定应用程序的响应者链,First Responder代理作为响应者链中接受行为消息的替代目标。
        Top-Level Objects
            Top-Level对象是nib文件加载后,对象图中没有父对象的对象。File’s Owner、First Responder和Application对象是代理对象,不是Top-level对象。
        加载Nib文件
            通过NSBundle加载
                    - (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options;
                owner参数即File's Owner对象。
                返回Top-Level对象的数组。
            通过UIViewController加载
                    - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle;
                File's Owner对象为UIViewController对象本身。

    Nib文件设计指南
        延迟加载——nib文件只包含立即引用的对象,不是加载完成时就引用的对象放在另一个nib文件中,直到实际引用时再加载。

    Nib对象的生命周期
        加载过程
            1、加载nib文件的内容和所有引用资源至内存
                ●加载归档的整个nib对象图的原始数据
                ●加载关联的所有自定义的图像资源并加入图像缓存
                ●加载关联的所有自定义的声音资源并加入声音缓存(iOS是否有?)
            2、逆归档对象图并初始化对象
                ●标准的IB对象(包括这些对象所属类的子类的对象)通过initWithCoder:初始化
                    在iOS中,任何实现NSCoding协议的对象都通过initWithCoder:方法初始化,包括UIView和UIViewController及其子类
                ●其他自定义对象通过init方法初始化
            3、建立所有nib文件中对象间的连接(包括action、outlet和binding)
                ●Outlet连接
                    iOS通过setValue:forKey:方法重建outlet连接,会生成KVO通知。
                ●Action连接
                    iOS通过addTarget:action:forControlEvents:方法配制action,如果target为nil,action会被响应者链处理。
                ●binding
                    iOS不支持
            4、发送awakeFromNib消息给相应的对象,发此消息的顺序无法保证。iOS不发送该消息给File’s Owner、First Responder和其他代理对象。
            5、显示所有“Visible at launch time”为真的窗口。 

    Nib文件的内置支持
        可以通过Info.plist文件中的NSMainNibFile关键字指定应用程序加载主窗口Nib文件。

    加载时替换代理对象
        代理对象表示在nib文件之外创建单与nib文件的内容有连接的对象。
            - (void)applicationDidFinishLaunching:(UIApplication *)application {
                NSArray*    topLevelObjs = nil;
                NSDictionary*    proxies = [NSDictionary dictionaryWithObject:self forKey:@"AppDelegate"];    // nib文件中的标签
                NSDictionary*    options = [NSDictionary dictionaryWithObject:proxies forKey:UINibExternalObjects];

                topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"Main" owner:self options:options];
                if ([topLevelObjs count] == 0) {    
                    NSLog(@"Warning! Could not load myNib file.\n");
                    return;
                }

                // Show window
                [window makeKeyAndVisible];
            }

posted @ 2015-06-11 14:17  WFApple  阅读(1055)  评论(0)    收藏  举报