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

时间:2009-06-02 17:49:19

标签: iphone uiview uiviewcontroller interface-builder uinavigationcontroller

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

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

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil];
[tabBarController presentModalViewController:menu animated:anim];

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如何要求你建立理想的等级。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

我想您可能不了解文件所有者是如何在NIB文件中使用的。我已经写了一个回复来描述文件的所有者under another question

当您调用此行时:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil]

您创建一个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];

您的XIB文件如下所示:

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

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

答案 1 :(得分:1)

这个问题的症结是Travis自己说的:“你如何加载导航控制器笔尖,尽可能在Interface Builder中进行设计?”而且从示例中看,这意味着UINavigationController和关联的UIViewControllers。

通过这种解释,答案是您无法在单个XIB中完全配置UINavigationController及其UIViewControllers。是的,想要这样做很直观,所以你不会疯狂。

当我说你不能这样做时,我的意思是最常用的框架方法没有办法处理这个问题。没有 [UINavigationController alloc] initWithMegaNibName 。是的,你可以在一个XIB中填充几乎任何东西并编写代码以特殊方式保湿对象,但我不认为这就是你要找的东西。

你可以像Jon建议的那样使用两个或更多个XIB,但是事情不那么自包含,所以你有很多人发现在代码中部分或全部控制器更简单。

不幸的是,Interface Builder功能与其他开发平台上的代码之间没有1:1的对应关系。我通常更愿意让设计师尽可能多地参与创建资产,但我知道其中大多数都没有编写Objective-c。

答案 2 :(得分:0)

在IB中,在MenuController nib中添加一个UIView并将该视图设置为插座。您需要为UIViewController设置该视图。 Here是显示基本设置的Apple页面的快速链接。不确定它是否会在你现阶段帮助你。