这是一个相当普遍的问题,但我想了解这一点 -
我通常在不使用IB的情况下构建我的应用程序。
感谢 SHANI
答案 0 :(得分:3)
一:Nibs的工作量可能要少得多。如果你有一大堆早期代码,包括很多“创建这个标签;将它的字体大小设置为14;将它放在(12,12; 128x96)”,那么你就有了一个很好的候选来从nib加载。< / p>
二:对于 中的对象,在nib加载时调用init
的nib和相关方法可能不明显。我发现的规则是:
使用initWithCoder:
创建具有直接IB支持的类(UIViews,内置UIViewControllers)的对象。这会绕过正常的指定初始化程序,因为IB在您编辑nib时(实际上使用正常的指定初始化程序)实际实例化了该对象的实时实例,然后将其序列化。当您对这些类进行子类化时,这会产生影响:只有在IB中创建并序列化了UIKit基类的实例,因此完全绕过了初始化程序。但是,请参阅下文。
使用占位符实例化的对象 - “NSObject”橙色(或蓝色)多维数据集 - 使用普通init
创建。这是因为IB无法实例化任何类;所以它将一个“占位符对象”序列化到nib中,然后在nib load处交换所需类的新init
ed实例。但是:
上述两个都被awakeFromNib
调用。因此,如果该对象始终是从笔尖创建的,那么您可以在那里进行任何您喜欢的特殊设置。小心,您可以制作一个通用的设置方法,并从awakeFromNib
和非init
初始化程序中调用它,以便能够使用该笔或不使用该类。
当然,上述所有内容都不适用于“文件所有者”,它是在您加载nib之前创建的。
三:在UIViewController
中,loadView
执行nib文件的实际加载(如果没有nib文件,则提供单个空视图。)如果要创建视图,请覆盖一些另一种方式。如果你想重新排列或添加从笔尖加载的内容,viewDidLoad
是一个更好的地方:有些情况下loadView
永远不会被调用,但viewDidLoad
仍然是。 (例如,当一个VC及其视图都在同一个笔尖中实例化时;苹果建议不要这样做,即使它有时很方便。)viewDidLoad
也很好地与viewDidUnload
平衡,所以分配的东西viewDidLoad
中viewDidUnload
可以并且应该在{{1}}中发布。
Nibs值得学习。一旦掌握了它,你就会爱上它们;他们自1989年以来一直坚持下去是有原因的。
答案 1 :(得分:1)
init
及其名称只应用于设置理想的ivars默认值。 loadView
用于设置视图层次结构,从视图控制器的后备视图开始。即,特别说明;除非您设置它,否则不要引用self.view
属性,这将导致无限循环。只是一个友好的protip。loadView
用于设置后备视图(如果覆盖它必须由您创建),并且在加载视图后调用viewDidLoad
(在{{之后) 1}}被称为)。您可以在适当的位置执行相应的项目。答案 2 :(得分:0)
有些人会说在代码中编写ViewController会“更容易”并且会使应用程序加载更快,因为它不需要在启动时加载文件。虽然这取决于.xib的大小,但如果您是一名知道如何在所有代码中编写应用程序的开发人员,那么使用.xib制作应用程序会更容易,更快,因为您不必制作一个对象
UISomething *smthng = [[UISomething alloc] initWithFrame:CGRectZero];
[smthng doSoemthing:nil];
//ect ect...
一遍又一遍地构建你的UI。
对于loadView和viewDidLoad,Apple说loadView用于以编程方式加载视图,但你仍然可以将它用于.xibs