initWithNib vs将文件所有者设置为viewcontroller子类

时间:2011-03-15 21:09:03

标签: iphone objective-c

我不了解nib文件与将文件所有者设置为viewcontroller子类的角色。如果我将nib的文件所有者设置为我的子类,那么当我实例化子类时,nib似乎加载了它的所有子视图。为什么我需要initWithNib?

在另一种情况下,我注意到当我在一个nib中创建一个tableview,在tableview中添加了一个搜索栏并将文件所有者设置为uitableviewcontroller的子类时,除非我使用了initWithNib,否则搜索栏不会显示。在我不在之前的情况下,为什么在这种情况下我需要initWithNib?

2 个答案:

答案 0 :(得分:4)

我很难理解你的问题。

-initWithNibName:bundle:是UIViewController的指定初始值设定项。如果需要,可以为nib名称和bundle传递nil,在这种情况下,默认行为是查找与app bundle中视图控制器子类名称相同的.xib文件。因此,使用具有相同名称的视图控制器和.xib并简单地为名称和包传递nil并不罕见。但是,您可以使用几个不同的nib,它们都可以使用相同的视图控制器子类。例如,您可能有一个笔尖以纵向布局,另一个笔尖以横向布局,您可以根据设备的方向决定使用哪个笔尖。

文件的所有者是nib中的一个对象,它是加载nib文件的对象的代理。您可以(并且应该)设置其类型,以便Interface Builder知道加载文件的对象可以提供哪些出口和操作,从而可以连接到File的Owner代理。当应用程序运行并且对象加载一个笔尖时,该笔尖内连接到文件所有者的任何对象将改为连接到加载该文件的对象。这是nib中的对象可以与应用程序的其余部分进行通信的主要机制。

因此,尽管File的Owner和-initWithNibName:bundle:在加载nib时都起作用,但它们的角色非常不同,而且大部分是正交的。如果您在某些视图控制器上成功调用-init并且发现无论如何都要加载nib,那么-init的实现可能会调用-initWithNibName:bundle:并传递两个参数的nil,如上所述。

答案 1 :(得分:0)

有一个回退逻辑,它使用视图控制器类的名称作为查找nib的默认值。这就是为什么你不必明确提供它 - 只要名称对应,系统就会为你找到它。另一方面,如果您选择为您的笔尖指定不同的名称,那么您可能会发现initWithNib很有用。