Resource Programming Guide 之 Nib Files(2)

Nib文件设计指南

    当创建你的Nib文件时,最应该认真思考的是如何使用这些Nib中的对象一个简单的应用可能在Nib文件中存储所有用户界面元素,当对大多数应用来说,最好把这些元素分到不同的Nib文件中。创建小的Nib文件会让你立即加载界面的这些部分在需要的时候,它们也会让你调试更容易些,即使只有很少的地方寻找问题。当创建Nib文件时,下面的指南应该记在心里。

     1) 用懒加载的方式设计你的Nib文件。计划加载Nib文件时,只马上加载你包含对象中所需要的

     2) 对于OSX应用程序的主Nib文件,考虑到只存储应用的Nib文件的菜单条和选择性的应用代理对象,为了避免包括的一些窗口或用户界面元素在应用启动后不会被用到,

         相反,把这些资源隔离在Nib文件中,只在启动后用到时再加载。

     3) 存储重复的用户界面元素在分离的Nib文件中(比如文件窗口)

     4) 对应偶然用到的窗口或菜单条,也把它存储在分离的Nib文件中。通过存储在不同的Nib文件中,有且仅有当这些资源被用过,你才加载这些资源到内存中去。

     5) 让File‘s Owner 只作一些Nib文件的外部接触点

NIb对象的生命周期

     当一个Nib文件加载到内存中,Nib-loading 代码需要确保这些对象在Nib文件中被创建并且已经初始化了。理解了这些步骤会帮助你写出漂亮的代码管理你的用户界面

对象加载过程

     当你用到NSNib 或NSBundle的方法加载或实例化Nib文件里的对象时,基本的nib-loading 代码做。。如下

     1. 它加载Nib文件的内容和一些引用资源文件到内存

           1)所有Nib文件对象图标的生数据被加载到内存但是没有解归档

           2)任何和Nib有关的自定义图片资源加载添加到Cocoa 图片缓存中 :看“About Image and Sound Resources"

           3)任何和Nib有关的自定义声音资源背景载到Cocoa 声音缓存中:看 ”About Image and Sound Resources"

    2. 它解归档Nib对象图表数据,初始化这些对象,它怎么初始化每个对象取决于每个对象 的类型以及它是怎么归档的。nib-loading 代码使用如下的规则去决定用哪一种初始

        化方法。

           a)默认,对象会收到一条initwithCoder: 消息

                 在OSX中,标准对象的列表包括视图,单元格,菜单条,视图控制器,它们是由系统提供的而且在默认的Xcode库中是可以访问的。它同样也允许使用自定义组件

                 把第三方对象添加到库中,即使你改变了这个对象的类,Xcode把标准对象归档到Nib文件中,然后告诉文档在对象解归档的时候交换自定义类,在iOS中,任何对象

                 遵守NSCoding协议都用initWithCoder方法初始化,这包括了所有的UIView 和UIViewController 的子类 ,要么是部分Xcode库要么是自定义类

          b)OSX中的自定义视图会收到initWithFrame: 消息

                 自定义视图是NSView的子类,这些子类Xcode没有可用的实现,通常是你应用中的一些自定义视图,用于自定义可视化内容。自定义视图不包括标准系统视 图                          ( 像NSSlider),它们是默认库的一部分或者是第三方集成组件。当它遇到自定义组件时,Xcode 会归档一个特殊的NSCustomView 对象到你的Nib文件中,这个

                自定义对象包括它需要创建指定的视图子类的信息。在加载时,这些NSCustomView对象发送一个alloc 和initWithFrame: 消息到真实的视图类中然后交换结果视图

               对象,这个效果是真实视图对象处理后来的交换在nib-loading 处理过程中,在IOS中的自定义视图不用initWithFrame:方法初始化

         c) 自定义对象而不是之前步骤中描述的会收到一个init 消息

    3. 它重新创建Nib文件中的所有对象之间的连接(动作,输出口,绑定)。这包括连接到File’s Owner 和其他的占位对象。创建连接的不同方法取决于平台

         a) 输出口连接

          在OSX中,nib-loading 代码试图先用自己的方法重新连接输出口,对每个输出口来说,Cocoa 会寻找一个设置输出口名称的方法 setOutletName: 以及在展示的时候

          执行它,如果它不能找到这样一个方法,Cocoa 会为这个对象搜索相应的输出口名称的实例变量,试图直接给它设值,如果实例变量找不到,不会有连接创建

          在OSX v 10.5 以后,设置输出口 也会对所有注册的观察者产生键值观察者通知,这些通知会发生在所有inter-object 连接重建、所有awakeFromNib方法执行之前

          和v 10.5之前的版本相比,这些通知不会产生,更多关于KVO通知 看 "Key-Value Observing Programming Guide"

          在iOS中,nib-loading 代码用 setValue:forKey: 方法去重新连接每个输出口。那方法很像寻找一个合适的存取器方法,当失败后依靠其他的意思。更多关于这个方法

          set Values 看它的描述 NSKeyValueCoding Protocol Reference 设置一个IOS的输出口会对每个注册的观察者产生一个KVO通知,这些通知同样可能发生在所有

         inter- object 连接重建之前以及所有对象的awakeFromNib 方法调用。更多关于KVO通知 看:"Key-Value Observing Programming Guide"

     4. 动作连接

             在OSX中,nib-loading 代码用源对象 setTarget 和 setAction: 方法去重建和目标对象的连接。如果目标对象对动作方法没有反应,不会有连接创建。如果目标对象是

             空,这个动作将会被响应链处理

             在iOS中, nib-loading 代码会用UIControl 对象的 addTarget:action: forControlEvents: 方法去执行这个动作,如果目标为空,动作同样也被响应链处理

     5. 绑定

           在OSX中Cocoa用源对象 bind:toObject:withKeyPath:options: 方法去创建它和它的目标对象的连接

           在IOS中不支持绑定

 4. 它向Nib文件中合适的对象发送一个 awakeFromNib 消息,这个对象定义了匹配的selector

            在OSX中,这个消息会发送到每个定义这个方法的界面对象。同样也发送到File‘s Owner 和其他定义的占位对象

            在iOS中, 这个消息只发送给被nib-loading 代码实例化的界面对象,它不不发送给File's Owner ,First Responder ,或者其他的占位对象

 5. 当在Nib文件中的启动时可见属性支持时,他会的展示在任意窗口

            nib-loading 代码调用对象的awakeFromNib方法的顺序是不确定的,在OSX中,Cocoa 努力最后调用File's Owner的awakeFromNib ,但是行为是不能得到保证的

           如果你需要进一步确定对象在你的Nib文件中,在加载时,最合适的时间去做是nib-loading 调用返回时。在那个点,所有的对象都创建,初始化,而已已经在使用了


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值