关于IB,init,加载视图和视图是否加载?

时间:2011-01-22 21:47:26

标签: iphone interface-builder

这是一个相当普遍的问题,但我想了解这一点 -

我通常在不使用IB的情况下构建我的应用程序。

  1. 使用IB与以编程方式创建界面的缺点和优点是什么?
  2. 什么压缩/代码适合init方法以及什么是loadView方法?
  3. loadView和ViewDidLoad之间有什么区别或者我只需要使用其中一个吗?
  4. 感谢 SHANI

3 个答案:

答案 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初始化程序中调用它,以便能够使用该笔或不使用该类。

    < / LI>
  • 当然,上述所有内容都不适用于“文件所有者”,它是在您加载nib之前创建的。

三:在UIViewController中,loadView执行nib文件的实际加载(如果没有nib文件,则提供单个空视图。)如果要创建视图,请覆盖一些另一种方式。如果你想重新排列或添加从笔尖加载的内容,viewDidLoad是一个更好的地方:有些情况下loadView永远不会被调用,但viewDidLoad仍然是。 (例如,当一个VC及其视图都在同一个笔尖中实例化时;苹果建议不要这样做,即使它有时很方便。)viewDidLoad也很好地与viewDidUnload平衡,所以分配的东西viewDidLoadviewDidUnload可以并且应该在{{1}}中发布。

Nibs值得学习。一旦掌握了它,你就会爱上它们;他们自1989年以来一直坚持下去是有原因的。

答案 1 :(得分:1)

  1. 优点是它起步更快,你可以更快速,更容易地调整子视图的位置。缺点:您仅限于在Interface Builder中可以执行的操作,这比您在代码中几乎总能实现的要少。此外,一些观点在IB之外的行为之间的相互作用可以吸引新用户。
  2. init及其名称只应用于设置理想的ivars默认值。 loadView用于设置视图层次结构,从视图控制器的后备视图开始。即,特别说明;除非您设置它,否则不要引用self.view属性,这将导致无限循环。只是一个友好的protip。
  3. 如前所述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