什么是loadNibNamed:在AppDelegate中执行的方法?

时间:2014-03-08 13:50:15

标签: ios

[[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
[self.window addSubview:rootController.view];

我知道这两行代码定义了我的App的根视图, 但我不知道这两条线如何实现它。

有人能分别解释这两行代码吗?特别是第一行,我不知道它在我们的视图机制中实际做了什么

谢谢

2 个答案:

答案 0 :(得分:0)

加载xib时,您将self作为owner传递,因此您在xib中为File's Owner创建的任何连接都将在应用委托上设置属性。在名为TabBarController的xib中,您很可能会UITabBarControllerrootController File's Owner相关联。

因此,一旦xib加载并完成了所有连接,您将通过tabBarController引用-[AppDelegate rootController]。接下来,您从rootController抓取视图并将其粘贴在视图层次结构中。

此代码需要更新。由于iOS 4 UIWindow期望在此方法结束时设置rootViewController,因此您应该在日志输出中看到此效果的警告。

答案 1 :(得分:-1)

首先。这两行都是错误的。

他们做了什么?

  1. 告诉主捆绑打开.nib文件(编译.xib),构建其中描述的对象并将文件所有者连接连接到self错误:这应由UIViewController负责,并使用初始化程序initWithNibName:bundle: 自动

  2. 将视图控制器的视图添加到单个窗口。 错误:您应该将视图控制器指定为窗口rootViewController

  3. 怎么做?

    1. 创建UIViewController的子类,可能名为MYTabBarController

    2. 创建名为 MYTabBarController.xib 的XIB文件(与类相同),文件所有者为MYTabBarController

    3. App Delegate 中初始化此视图控制器:

      MYTabBarController *rootController = [[MYTabBarController alloc] init];
      // In case your XIB has different name: -initWithNibName:@"xib name" bundle:nil
      
    4. 将视图控制器分配给窗口。这条单行内部加载XIB并添加子视图,就像你试图做的那样。

      window.rootViewController = rootController;
      
    5. 更多选项?

      如果您不需要继承UIViewController,您可以:

      1. 创建一个XIB,其中文件所有者UIApplication本身。文件名并不重要。

      2. 在此您可以根据需要创建窗口根视图控制器(例如UITabBarController)和一些嵌套视图控制器。

        < / LI>
      3. 在Info.plist中的“主nib文件基本名称”或NSMainNibFile下指定此XIB。它将在调用application:didFinishLaunchingWithOptions:之前加载。