本文主要是介绍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 调用返回时。在那个点,所有的对象都创建,初始化,而已已经在使用了
这篇关于Resource Programming Guide 之 Nib Files(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!