6

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

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

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

MenuController 本身的结构如下:

菜单控制器.xib
  文件的所有者(MyNavCtrlrSubClass:UIViewController)
  导航控制器 (UINavigationController)
    导航栏 (UINavigationBar)
    根视图控制器(Nib Name 设置为加载 AnotherViewController.nib)
      导航项 -> (UINavigationItem)

这一切正常,除了加载 MyNavCtrlrSubClass 时,我收到以下错误:

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

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

我显然在 IB 中遗漏了一些东西,但是什么?MyNavCtrlrSubClass.m 本身没有代码,除了 UINavigationController 的 IBOutlet。我在尝试完全在 IB 中进行设置是否犯了错误?这个想法是将模态导航控制器保留在一个 nib 中,并将它加载的所有视图都加载到单独的 nib 中,但是由于 MenuController 只是导航的容器并且本身不包含视图,因此我显然设计错了。:)

如果您想知道我为什么不以其他方式设计它,那是因为我试图服从我(可能是错误的)对 IB 如何要求您建立理想层次结构的看法。

任何帮助将不胜感激。

4

3 回答 3

5

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

当您调用此行时:

[[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)
  • 界面视图
    • 子视图 A
    • 子视图 B

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

于 2009-06-03T03:14:41.050 回答
1

这个问题的症结由 Travis 自己说:“你将如何加载 Navigation Controller nib,尽可能在 Interface Builder 中进行设计?” 从示例中也可以看出,这意味着 UINavigationController 和关联的 UIViewControllers。

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

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

正如 Jon 建议的那样,您可以使用两个或更多 XIB,但是事情不那么独立,因此您有很多人发现在代码中执行部分或全部控制器更简单。

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

于 2011-04-19T21:51:00.873 回答
0

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

于 2009-06-02T18:28:11.343 回答