2012-01-12 85 views
7

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

我正在使用界面生成器为我正在创建的应用创建UI。该应用程序有一个显示一系列按钮的单个屏幕。点击一个按钮会显示一个覆盖按钮的相关视图。点击另一个按钮隐藏以前的覆盖视图并显示另一个视图。

太让管理更简单的用户界面在IB我已经决定要创建多个笔尖文件是点击相关按钮时会出现在每个子视图。然后,我使用UINib类在视图控制器的viewDidLoad方法中加载子视图的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]; 
... 

上面的代码重复其他视图。

总之我有一个有分层的是显示/隐藏通过点击按钮的观点在一个屏幕的iPhone应用程序。这是通过一个具有关联的nib文件的单个视图控制器以及一系列用于视图控制器的viewDidLoad方法中加载的子视图的附加nib文件实现的。

问题!

对不起,长介绍,但我想很清楚这是我在做什么。

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

注意

之前有人问我为什么不只是显示一个新的屏幕上的子视图,并使用导航栏,让我说,我有很好的理由,我不明白的iOS UI准则。上面的用例并不完全是我的用例,但它清楚地描述了问题,而没有陷入我的开发应用程序中。

而且我知道我可以写所有的子视图作为代码,但每个子视图有子视图一个复杂的布局,这将是一个很大的代码和插科打诨,试图让他们找合适的。

在此先感谢。

回答

1

视图控制器和视图之间不一定是1对1的关系。大多数视图都包含许多子视图,这些视图本身是视图,所以这从字面上看并不合理。

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

例如,如果您有两个sbuviews,每个tableViews,您可能想要为每个tableView有一个视图控制器。这是因为每个tableView都在查看相同的委托方法,并且如果它们在同一个viewController中,那么委托方法必须区分tableView。委托方法的签名允许这样做,但根据我的经验,它确实会造成难以遵循且难以管理的凌乱的代码设计。另一方面,您可能有两个表由同一个viewController管理,其中一个表充满了有意义的数据,另一个表只是一个占位符(与数据源为空时一样)。一个可能可见,而另一个不可见。当两个视图控制器都由相同的数据源(模型)驱动时,为什么让您的生活变得复杂?

在我看来,这归结于遵循和管理代码有多困难。如果使用单个视图控制器的复杂性变得繁重,则可以考虑使用更多的视图控制器。

UPDATE

顺便说一句,我有我目前与工作可以说明类似的情况的例子。在许多开发人员使用的InAppSettingsKit中,有几个用于主视图片段的xib文件。 You can look at the structure here on github。有一个主视图控制器和几个xib文件。 (我也称之为“助手”视图控制器和电子邮件编辑器视图控制器。)在此示例中,可以多次使用xib文件来指定表视图单元格的布局。尽管如此,每个xib文件都没有视图控制器。 (InAppSettingsKit的文档很稀疏,所以这些东西可能不是很明显,只是快速浏览一下。)

+0

因此,对于我将视图拆分为单独的nib文件的唯一原因是为了更容易地管理IB中的这些视图,您认为我的方法可以安全使用,还是会破坏Apple的准则? – Camsoft 2012-01-13 10:18:54

+0

关于你在做什么没有规则或指南。你在这方面很好。 – Jim 2012-01-13 15:38:06

+0

我添加了许多开发人员使用的真实软件组件的示例。有关更多详细信息,请参阅上面的答案 – Jim 2012-01-13 17:22:49

1

每个视图都应该有一个对应的UIViewController。使用一个ViewController来“控制”多个视图打破了MVC范例。从一个控制器“控制”多个“视图”会使得更改一件事而不会破坏其他事情变得更加困难。您如何向最终用户展示内容的选择会因个人而异。所以,如果你说一个NavigationController不能用于你的情况,也许一个Modal视图就是答案,或者你可能只是实例化你的自定义UIViewControllers并将它们添加到你的视图([addSubview:]),如果这就是你想要的道路,但就像我说过的那样,为每个视图对象和相应的xib创建一个“控制器”将是有益的。如果您需要回发信息,请使用委托或使用通知将邮件发送回父视图。我学会了不遵循MVC范式的难题,会让你的生活变得悲惨。尽量保持代码尽可能分离。并阅读MVC设计模式,您不会后悔。

+0

所有子视图都与单一屏幕,并且因此单个视图控制器。我可以很容易地将所有的子视图添加到同一个nib文件中,但是就像我说的那样,由于视图重叠,它变得混乱和难以布局。 我的想法是将一些视图分解为单独的nib文件,然后使用视图控制器的viewDidLoad方法将它们加载回主视图。 – Camsoft 2012-01-13 10:14:02

+0

每个视图都应该有一个对应的UIViewController。使用一个ViewController来“控制”多个视图打破了MVC范例。如果这是真的,通用视图控制器如何工作?它有2个笔尖。 – Juan 2013-01-17 04:53:46

+0

@胡伯特我在想同样的事情。似乎有一些与此相关的问题。如果决定是在运行时间和点击按钮上进行的,这是否意味着xib将被加载到背景中,实际上它们都会被加载,而其中一个会被选中?此外,自动布局可以轻松解决问题。 – 2016-07-22 18:47:18

0

实际上它可以做到这一点。打开你的.xib文件,选择File's Owner(在占位符) - >“identity inspector”(utilities) - >改变class name到你的控制器classname - >按住control并拖动文件的所有者占位符到View对象,选择“查看“对话框中。 现在您可以自定义您的视图。

p.s.您可以使用与第一个xib相同的插座,您只需将它们拖到新的xib(+确定控制)即可。

这里是一个解释教程: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

在SO中张贴链接可能不错,但链接往往会丢失......请在答案主体中发布您答案的关键要素。 – NirMH 2014-05-18 09:52:02

+0

@NirMH编辑。感谢您的反馈,它是我的第一个回答 – user3206558 2014-05-18 11:25:54

相关问题