2013-07-30 42 views
5

嗨,我正在阅读一本我不得不面对这种情况的书。 我创建了一个名为HeaderView.xib.的XIB文件然后我将这个XIB 文件的File Owner连接到ItemsViewController。到目前为止,一切都很好。我还连接了 ItemsViewController的某些插座和XIB上的视图。现在xib文件的设置文件所有者

,在ItemsViewController我不得不打电话这样的代码:上述

- (UIView *)headerView 
{ 
    // If we haven't loaded the headerView yet... 
    if (!headerView) { 
     // Load HeaderView.xib 
     [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil]; 
    } 

    return headerView; 
} 

代码将设置出口的ItemsViewControllerheaderView对XIB文件对应 视图(I与XIB建立的连接的一个文件)。 我的问题是,为什么我必须,两次,指定所有者? (例如,如我在该端口的开始中所提到的那样在XIB中一次,以及在代码中的第二次,例如owner: self)。

回答

6

没有指定文件的所有者两次:

  • 第一次(在XIB文件),您指定的文件所有者的类型; Interface Builder需要知道它可以连接哪些插座。
  • 第二次(在目标C代码中)您指定了所有者的实例。这在运行时需要知道插座连接到的物体。
+0

dasblinkenlight,那么让我问你这样的问题。如果我将某些XIB的文件所有者设置为ViewController。然后(在XIB中)将ViewController的View出口连接到XIB文件中的某个视图。那么这就是我必须要做的。我通常不会再像上面那样在代码中进行这种调用。为什么? (是否因为某处自动loadNibNamed在ViewController的视图中被调用?)? – user2054339

+0

@ user2054339隐式加载XIB还有其他方法 - 例如,如果您的视图控制器是使用'initWithNibName'实例化的,则不需要调用'loadNibNamed:'方法。 – dasblinkenlight

+0

@ dasblinkenlight:是的,我测试了它只是添加了一个ViewController。然后是一个XIB文件。将XIB文件的文件所有者设置为我的ViewController。然后,在XIB的视图控制器的XIB连接视图插座中查看我的视图。并且该视图被自动加载,无需再调用loadNibNamed了......我必须在这里调用loadNibNamed,因为它显然是因为它是一个不同的出口......也针对不同的类TableViewController ... – user2054339

3

在XIB中指定所有者告诉Xcode控制器理解什么(它有什么插座),以便它可以提供与您的连接。这是一个班级。

指定代码中的所有者告诉unarchiving进程控制器的哪个实例实际上将履行该角色,因此应该建立到从NIB中取消存档的新实例的连接。

0

我发现它......当全世界都没有使用XIB(S)了...... 打开您最喜欢的文本编辑器中XIB或NIB文件

,你会发现这条线有...

 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MyCalssName"> 

更改类名称,保存文件,您的文件的所有者将被更改。 注意:关闭Xcode(要自动重新加载更改)并在出现问题时进行备份。

相关问题