UINavigationController NIB要求File的所有者拥有一个视图?

Tra*_*unn 6 iphone interface-builder uiviewcontroller uiview uinavigationcontroller

我在Interface Builder中设置View Controller nib的默认View Outlet时遇到问题.这是我的设置:

我有一个基于TabBar的应用程序,我将导航控制器加载为模态视图...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil];
[tabBarController presentModalViewController:menu animated:anim];
Run Code Online (Sandbox Code Playgroud)

MenuController本身的结构如下:

MenuController.xib
  File's Owner (MyNavCtrlrSubClass : UIViewController)
  Navigation Controller (UINavigationController)
    Navigation Bar (UINavigationBar)
    Root View Controller (Nib Name is set to load AnotherViewController.nib)
      Navigation Item -> (UINavigationItem)

这一切都很好,除了加载MyNavCtrlrSubClass时,我得到以下错误:

Loaded the "MenuController" nib but the view outlet was not set

很清楚为什么会发生这种情况 - 文件所有者的视图没有插座连接.问题是我应该将其视为什么,并且首先必须设置一些东西?导航栏是MenuController.xib中唯一的候选者,但这样做只会将UINavigationBar本身调整为全屏模式,可以这么说.

我显然在IB中遗漏了什么,但是什么?MyNavCtrlrSubClass.m本身没有代码,除了UINavigationController的IBOutlet.我试图在IB中完全设置这个错误吗?我们的想法是将模态导航控制器保存在一个笔尖中,并将所有视图加载到单独的笔尖中,但由于MenuController只是导航的容器并且本身不包含任何视图,因此我显然设计错误.:)

如果你想知道我为什么不以其他方式设计它,那是因为我试图服从我(可能是错误的)感知IB如何要求你建立一个理想的等级.

任何帮助将不胜感激.

Jon*_*ess 5

我想您可能不了解文件所有者是如何在NIB文件中使用的.我在另一个问题下写了一个描述该文件所有者的回复.

当您调用此行时:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil]
Run Code Online (Sandbox Code Playgroud)

您创建一个MyNavCtrlrSubClass实例,并告诉它加载@"MenuController".然后在MenuController.xib文件中,有第二个不相关的UINavigationController,里面有东西.在运行时加载MenuController.nib时,将创建第二个导航控制器.

第二个问题是告诉UINavigationController加载NIB文件并不是真的合理,因为导航控制器创建和管理自己的视图.您确实想要创建根视图控制器,并告诉该视图控制器加载NIB文件.

试试这个:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease];
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController];
Run Code Online (Sandbox Code Playgroud)

您的XIB文件如下所示:

  • 文件的所有者(类设置为MyRootViewController,视图出口连接到后续的UIView)
  • 的UIView
    • 子视图A.
    • 子视图B.

在您熟悉所有这些工作方式之后,您可能还会考虑在一个XIB文件中实例化导航控制器和根视图控制器,就像您在发布的代码中开始那样.