在单个视图控制器中使用多个nib文件?

Cam*_*oft 7 interface-builder uiview nib ios4 ios

背景

我正在使用界面构建器为我正在处理的应用程序创建UI.该应用程序有一个显示一系列按钮的屏幕.单击按钮可显示覆盖按钮的关联视图.单击另一个按钮会隐藏上一个叠加视图并显示另一个.

在IB中更容易管理UI我决定为每个子视图创建多个nib文件,这些文件在单击相关按钮时显示.然后我viewDidLoad使用UINib该类在视图控制器的方法中加载子视图的nib文件.

这背后的想法是避免在单个nib文件中将多个视图堆叠在彼此之上,因为这在IB中难以操纵.我本可以在代码中创建所有视图,但这需要大量繁琐的编码,因为每个子视图的布局都非常复杂(具有多个子视图).

从nib文件加载子视图的示例代码.

- (void)viewDidLoad
{
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil];
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil];

    // get root view from bundle array
    UIView *aSubView = [bundleObjects objectAtIndex:0];
    [self.view addSubview:aSubView];
...
Run Code Online (Sandbox Code Playgroud)

对于其他视图重复上面的代码.

总结一下,我有一个单屏iPhone应用程序,它具有通过单击按钮显示/隐藏的分层视图.这是通过一个视图控制器实现的,该控制器具有关联的nib文件和一系列用于子视图的附加nib文件,这些文件在视图控制器的viewDidLoad方法中加载.

问题!

很抱歉很长时间的介绍,但我想非常清楚我在做什么.

  • 我的方法是不好还是不寻常?
  • 这样做有什么潜在的问题吗?
  • 当其他人需要动态界面并且仍想在Interface Builder中保留所有内容时,他们做了什么?

笔记

在有人问我为什么不在新屏幕上显示子视图并使用导航栏之前,让我说我有很好的理由,我确实理解iOS UI指南.上面的用例并不完全是我的用例,但是它可以清楚地描述问题而不会陷入我的开发应用程序中.

另外我知道我可以将所有子视图编写为代码,但每个子视图都有一个复杂的子视图布局,这将是很多代码和乱七八糟的尝试让他们看起来正确.

提前致谢.

Jim*_*Jim 1

视图控制器和视图之间不一定存在一对一的关系。大多数视图都包含许多子视图,这些子视图本身就是视图,因此这实际上没有意义。

但是,根据视图的复杂性(包括其内容),您可能需要单独的视图控制器……也可能不需要。

例如,如果您有两个 sbuview,每个 sbuview 都是 tableView,则您可能希望每个 tableView 有一个视图控制器。这是因为每个 tableView 都查看相同的委托方法,并且如果它们位于同一 viewController 中,则委托方法必须区分 tableView。委托方法具有允许这样做的签名,但是根据我的经验,它确实会导致难以遵循和管理的混乱代码设计。

另一方面,您可能有两个由同一个 viewController 管理的表,其中一个表填充了有意义的数据,另一个表只是一个占位符(当数据源为空时)。其中一个可能可见,而另一个则不可见。当两个视图控制器都由相同的数据源(模型)驱动时,为什么要通过创建两个视图控制器来让你的生活变得复杂呢?

在我看来,这取决于遵循和管理代码的难度。如果使用单个视图控制器的复杂性变得繁重,请考虑使用更多视图控制器。

更新

顺便说一下,我目前正在使用的一个例子可能可以说明类似的情况。在许多开发人员使用的 InAppSettingsKit 中,有几个用于主视图部分的 xib 文件。您可以在 github 上查看该结构。有一个主视图控制器和几个 xib 文件。(还有我所说的“帮助器”视图控制器和电子邮件编辑器视图控制器。)在此示例中,xib 文件可以多次使用来指定表视图单元格的布局。不过,每个 xib 文件都没有视图控制器。(InAppSettingsKit 的文档很少,因此仅快速浏览一下这些内容可能并不明显。)