Mai*_*r00 14 objective-c storyboard nib ios ios7
我开始对iOS中的NIB/Storyboards机制的低级细节感兴趣.我想更多地了解他们的实现 - 我有兴趣开发自己的机制.我在Apple网站上找到了一些有关NIB文件的信息.
他们说:a nib file describes these objects exactly as they were configured in Xcode. At runtime, these descriptions are used to recreate the objects and their configuration inside your application..好.但我找不到有关如何实现故事板的任何信息.故事板只是一堆(包)NIB文件 - 每个一个UIViewController?或者它使用不同的机制?
那XMLNIB /故事板的来源呢?是否有一些从XML到Objective-C源代码的发动机罩下转换器?低级细节将不胜感激.
Leo*_*ica 26
故事板和XIB文件被编译为二进制格式的NIB文件.部署应用程序时,可以在捆绑包中找到这些文件.
NIB文件更易于理解.它们包含一组对象层次结构.故事板更复杂,因为它们包含整个场景,因此包含更多元数据(例如哪个视图控制器是场景中的初始值等).Segues也是可解码的对象.
在NIB文件和故事板中定义的每个对象都有一个唯一的密钥(例如vXZ-lx-hvc,在编译时,它具有附加到其上的类的名称,因此它最终LNViewController-vXZ-lx-hvc是例如).
当您尝试加载在NIB或故事板中定义的对象(通常是视图,视图控制器和segue,以及您可以在Interface Builder中定义的其他对象)时,UINibDecoder会创建一个类型的解码器,它负责读取二进制文件中的数据NIB文件并将其解码为活动对象.然后分配并initWithCoder:调用一个对象,通过解码器.然后,该对象为它支持的每个属性调用各种解码方法.例如,表视图将解码其样式,其背景视图,单元格高度,其委托等等.解码完成后,NIB加载程序调用awakeFromNib以通知从NIB加载的对象.
故事板被编译成多个NIB文件,通常是每个视图控制器的NIB文件.从故事板加载对象时,内部UIStoryboard具有要为特定视图控制器加载NIB文件的元数据.当视图控制器被解码时(在其中initWithCoder:,它加载其整个视图层次结构,属性值,附加对象等).
最后,每个NIB文件(以及扩展名为故事板)能够包括键值信息,该信息在成功解码对象之后应用.
要实现您自己的类似系统,您需要提供一个类似的系统,可以推断出类型,分配对象,然后使用您自己的解码器对其进行初始化.由于视图和视图控制器实现了NSCoding协议,因此您可以轻松调查它们支持的密钥,并创建解码器和数据格式以支持相同的密钥.
如果您希望遵循NIB和故事板加载流程,我建议查看类转储,为关键方法设置断点并检查传递的参数到方法调用.当在64位模拟器调试,该组件输出非常容易阅读,并且可以很容易地使用通过巡视参数po $arg1为self对象,po NSStringFromSelector($arg2)对所调用的方法选择器,po $arg3...为以下参数.
建议的方法开始:
-[UIStoryboard instantiateViewControllerWithIdentifier:]
-[UIStoryboard instantiateInitialViewController]
-[UIStoryboard nibForViewControllerWithIdentifier:]
-[UINibDecoder decodeObjectForKey:]
Run Code Online (Sandbox Code Playgroud)
(和其他-decode***ForKey:方法)
设置符号断点并查看传递的程序集和参数.
使用状态恢复时会发生非常类似的过程.不同的是,视图提供了编码器,他们将其属性编码为编码器; 在恢复期间,从状态恢复解码器恢复视图.