nib文件如何知道其文件所有者控制器

时间:2011-04-15 09:45:23

标签: objective-c cocoa cocoa-touch uiviewcontroller nib

当创建UIViewController和相应的nib文件时,此nib文件通常与控制器同名,但可以重命名。那么,IB如何知道这个nib文件引用哪个UIViewController

当从引用插座或动作中拖动时,IB仅显示特定Controller的方法。它是如何选择的?当一个人重命名笔尖时,我想知道IB是否保存了笔尖与UIViewController之间的连接。

我脑子里似乎有太多混乱吗? :)希望不要......

此致 FAK

3 个答案:

答案 0 :(得分:3)

如果您打开IB并在检查器窗口的第四个选项卡中检查文件所有者的类,那么您可以在此处看到类名。enter image description here

答案 1 :(得分:3)

nib文件不一定需要知道UIViewController的哪个特定子类是其文件的所有者。请注意,视图控制器拥有的nib加载(通常)分两步完成:

  1. 实例化UIViewController的(子类)实例
  2. 该实例接收-initWithNibName:bundle:,因此知道它应该加载的nib文件,实例将成为nib文件的所有者。
  3. 因此需要知道nib文件名的UIViewController(或其子类)实例,但反过来不一定是真的。

    也就是说,UIViewController的子类通常定义nib文件中对象的出口并接收动作。为了在Xcode / Interface Builder中连接出口和操作,您可以在身份检查器中将文件的所有者类设置为UIViewController的相应子类。

答案 2 :(得分:1)

我知道这是一个古老的问题。请在这里分享我的理解。

假设我们在XCode中创建UIViewController的子类,并将其命名为SecondViewController,默认情况下其xib文件名为SecondViewController.xib。然后让我们先看看如何创建这个VC,然后讨论文件所有者是什么。

  1. 使用nib名称创建并显示SecondViewController:让我们使用initWithNibName创建VC:bundle:指定了xib名称,代码可以是这样的:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  2. 创建并显示没有nib名称的SecondViewController:如果一切都是默认的,这意味着VC具有与xib文件名相同的类名,那么我们可以忽略nib名称,创建vc的代码可以是像这样:

    SecondViewController * vc = [[SecondViewtController alloc] init];
    [self presentViewController:vc animated:YES completion:nil];
    
  3. 使用不同的xib文件名创建和显示SecondViewController:如果重命名xib文件名,则必须在创建VC时指定xib文件名,代码可以是这样的:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController2" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  4. 什么是文件的所有者?首先,正如Apple所说,它是一个占位符对象。此对象是xib文件中定义的对象的容器。此外,此对象可以接收xib中对象发送的消息,例如按钮单击消息。创建插座或操作时,其目标将是文件的所有者,但此对象在设计时未知。在界面构建器中,它显示如下: File's Owner as the target of the action

  5. 什么是文件的所有者?其次,它是界面构建器中显示的类名。此类的实例包含xib中定义的对象。它显示如下: enter image description here

  6. 如果我没有为文件所有者设置类名怎么办?在这种情况下,IB不允许您通过控制拖动来创建插座或操作,因为它不知道谁将包含插座或操作。

  7. 如果在创建插座或操作后删除文件所有者的类名怎么办?可以删除IB中的班级名称。您创建代码将像以前一样运行良好。

  8. 让我们回到问题:" nib文件如何知道其文件的所有者控制器"?

    • 在设计时,IB仅在设置文件所有者的班级名称后才知道所有者控制器;
    • 在运行时,运行时将接收init或initWithNibName:bundle的对象设置为nib的文件所有者对象。