是否可以将UIViewController的视图添加到另一个UIViewController的视图中?

时间:2012-02-23 08:03:34

标签: objective-c ios uiviewcontroller

是否可以将UIViewController的{​​{1}}添加到另一个view的{​​{1}}?

请解释为什么这是一种好的做法或一种不好的做法。

6 个答案:

答案 0 :(得分:6)

Apple以及大多数遵循Apple指南的人都会告诉你这是不好的做法,因此Apple添加了ViewController包含(childViewControllers)。不幸的是,大多数人盲目地遵循这一点,并不会告诉你为什么这是不好的做法。我很高兴你这么做。

事实上,在模型 - 视图 - 控制器架构中,视图应该是可重用的,无论它们包含什么内容,因此视图和控制视图内容的对象不应该相同。这正是UIViewController在iOS5之前所做的事情Apple不鼓励你多次使用它们,而这是非常合乎逻辑的事情。当然这很令人困惑,许多人忽略了指导方针,无论如何都做了,包括我自己,应用程序工作正常并通过了应用商店验证,这引起了更多的混乱。 结果是,直到今天,人们仍然在Apple塌陷并给我们自定义容器ViewControllers一年多后就此问题。我已经看到人们经常使用复杂的答案来回答这个问题,只要将UIViewController重新创建为一个继承自NSObject的类来解决非常简单的问题。仅仅因为Apple不鼓励使用UIViewControllers,甚至不知道为什么。

由于将ViewController的视图添加为子视图通常可以很好地工作,并且iOS4中仍然没有ViewController包含,许多人仍然支持,太多人不打扰使用ViewController包含。这是更清洁的解决方案,当您想在ViewControllers中使用ViewControllers时,您应该尽可能使用它。如果没有,在大多数情况下,您应该能够简单地将ViewController的视图添加为子视图,您只需知道在哪些情况下。

如果您只是将ViewController的视图添加到另一个视图,那么您可以期待以下内容:

  • 不保证查看回调方法被调用。 viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear等方法可能会被调用,也可能不会被调用。它在很大程度上取决于操作系统版本,在iOS4中它们永远不会被调用,在iOS5及以上版本中,它们通常会被调用。所以你不能覆盖这些方法,因为你不能依赖它们,你无法控制它们被调用的时间,次数或次数。
  • 将始终正确调用的唯一视图回调方法是viewDidLoad。
  • 不会调用旋转回调。根据您的情况,这可能是一个大问题或根本不重要。如果视图的autoresizingmask足以重新定位并重新缩放它,那么你就没事了。如果没有,当调用superview的ViewController的旋转回调时,你总是可以进行自定义实现。
  • 您必须自己保留对ViewController的引用,否则它将立即释放,而其视图仍将由其superview保留。

我绝对不会鼓励它,但我也不会劝阻它。这是情境化的,如果你不再需要支持iOS4那么你可以避免它。但是,如果你记住上面的列表,那么它也不会造成任何伤害,你的应用程序将正常工作。

答案 1 :(得分:3)

有时它没关系,有时它不是。如果没有显示一些图表并解释视图控制器层次结构和视图层次结构之间的关系,那么很难给出更好的答案。

幸运的是,Apple已经做到了。观看WWDC 2011中的“实现UIViewController遏制”视频,详细说明何时可以,何时没有。

答案 2 :(得分:1)

这实际上是复杂视图层次结构的常见情况。从iOS 5开始,UIViewController使您可以添加子视图控制器。添加子控制器时,还要将子视图添加到控制器的视图中。

另一方面,您不应将视图控制器的视图添加到另一个视图控制器,而不将其添加为子视图控制器。

但是,不要滥用它。你应该在

时这样做
  • 您正在为一组控制器实现容器(类似于您自己的UINavigationControllerUISplitViewController
  • 子控制器是独立的。如果子控制器不断地在其父控制器上调用方法,那么将功能实现到一个控制器中会更好。

答案 3 :(得分:0)

你可能会侥幸逃脱,但可能有更好的方法。认为两者都试图操纵视图似乎是合理的。我的回答是否定的。

你想要完成什么?

答案 4 :(得分:0)

当然,您可以将UIViewController的视图添加到另一个UiViewController的视图中,至少作为类变量。但我无法理解这个解决方案的最终目标。 我认为这是一个不好的做法,因为应用程序界面的复杂性正在增加。

答案 5 :(得分:0)

通常在模型 - 视图 - 控制器架构中,我们可以重用视图。

但对于UIViewController,它可能并不总是好主意。它可能会使项目架构变得复杂,因为根据Apple文档视图与视图控制器紧密绑定,因此可能不容易管理。

来自UIViewController参考:  视图控制器与它们管理的视图紧密绑定,并参与用于处理事件的响应程序链。视图控制器是UIResponder类的后代,并插入到托管根视图与其超级视图之间的响应程序链中,后者通常属于不同的视图控制器。如果视图控制器的视图不处理事件,则视图控制器可以选择处理事件,也可以将事件传递给superview。

但是,我认为如果两个不同控制器的UI存在细微差别,我们可以重复使用视图。