Ios loadNibNamed:method在AppDelegate中做什么?

Ios loadNibNamed:method在AppDelegate中做什么?,ios,Ios,我知道这两行代码定义了我的应用程序的根视图, 但我不知道这两条线是如何实现的 有人能分别解释这两行代码吗?特别是第一行,我不知道它在我们的视图机制中实际在做什么 感谢您在加载您作为所有者传递的selfxib时,因此您在xib中与文件所有者建立的任何连接都将在应用程序代理上设置属性。在名为TabBarController的xib中,您很可能有一个UITabBarController连接到文件所有者上的rootController 因此,一旦xib加载并建立了所有连接,您就可以通过-[AppDele

我知道这两行代码定义了我的应用程序的根视图, 但我不知道这两条线是如何实现的

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


感谢您

在加载您作为
所有者传递的
self
xib时,因此您在xib中与
文件所有者
建立的任何连接都将在应用程序代理上设置属性。在名为
TabBarController
的xib中,您很可能有一个
UITabBarController
连接到
文件所有者上的
rootController

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


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

首先。这两行都错了。

他们做什么?
  • 告诉主捆绑包打开.nib文件(compiled.xib),构建其中描述的对象,并将文件所有者连接到
    self
    错误:这应由
    UIViewController
    负责,并使用初始值设定项
    initWithNibName:bundle:
    自动执行

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

  • 怎么做?
  • 创建
    UIViewController
    的子类,可能名为
    MYTabBarController

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

  • 在应用程序中,委托初始化此视图控制器:

    [[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
    [self.window addSubview:rootController.view];
    
  • 将视图控制器指定给窗口。这一行在内部加载XIB并添加子视图,就像您试图做的那样

    MYTabBarController *rootController = [[MYTabBarController alloc] init];
    // In case your XIB has different name: -initWithNibName:@"xib name" bundle:nil
    
  • 还有其他选择吗? 如果您不需要为
    UIViewController
    子类化,您可以:

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

  • 在这里,您可以创建窗口根视图控制器(例如
    UITabBarController
    )和一些您想要的嵌套视图控制器

  • 在Info.plist中的键“Main nib file base name”或
    NSMainNibFile
    下指定此XIB。它将在调用
    应用程序:didFinishLaunchingWithOptions:
    之前加载


  • AppDelegate负责设置初始UI屏幕。上面的几行基本上就是这样做的。像这样从xib加载并不可怕。根据代码判断,这可能是一些非常早期的iOS模板代码。另外,故事板现在基本上就是这样工作的,例如,它们加载ViewController,这使您在使用它们时远离
    alloc/init
    。@Paul.s当然不可怕,它可以作为一种高级技术从多个XIB加载VC。但是,如果有人正在学习iOS开发,应该明确指出,这不是正确的方法。对于故事板,您也从不手动加载笔尖。
    window.rootViewController = rootController;