将UIViewController的视图添加到另一个UIViewController的视图是可取的吗?

UIViewControllerview添加到另一个UIViewControllerview是可取的吗?

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

苹果,因此大多数人遵循苹果的指导方针将告诉你这是不好的做法,苹果添加ViewController遏制(childViewControllers)出于这个原因。 不幸的是,大多数人盲目地遵循这一点,不会告诉你为什么这是不好的做法。 我很高兴你这样问。

事实是,在模型 – 视图 – 控制器体系结构中,视图应该是可重用的,而不pipe它们包含的内容是什么,因此视图和控制视图内容的对象不应该是相同的。 在iOS5之前,UIViewController究竟是做了什么?苹果不鼓励你使用它们,而这是一个非常合乎逻辑的事情。 当然这是令人困惑的,许多人忽略了指导方针,无论如何,包括我自己在内,应用程序运行良好,并通过了app storevalidation,这导致了更多的混淆。 结果是,直到今天,人们还是在苹果崩溃后给我们提供了自定义的容器ViewControllers,甚至在一年多的时间里提出了问题。 我已经看到人们经常用复杂的答案来回答这个问题,至于重buildUIViewController作为一个从NSObjectinheritance的类来处理非常简单的问题。 只是因为苹果不鼓励使用UIViewControllers,甚至不知道为什么。

由于将ViewController的视图添加为子视图通常会很好地工作,并且ViewController的遏制在iOS4中还没有得到支持,许多人仍然不支持使用ViewController遏制。 这是更干净的解决scheme,当你觉得在ViewController中使用ViewController时,你应该尽可能地使用它。 如果没有,在大多数情况下,你应该能够简单地添加一个ViewController的视图作为子视图,你只需要知道在哪些情况下。

如果您只是将ViewController的视图添加到另一个视图中,您可以期待什么:

  • 查看callback方法不保证被调用。 像viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear等方法可能会或可能不会被调用。 这将主要取决于操作系统版本,在iOS4中它们不会被调用,在iOS5和更高版本中,它们大多会被调用。 所以你不能重写这些方法,因为你不能依赖它们,你无法控制什么时候,如果或者多less次被调用。
  • 将始终正确调用的唯一视图callback方法是viewDidLoad。
  • 旋转callback不会被调用。 根据你的情况,这可能是一个大问题,或根本无关紧要。 如果视图的autoresizingmask足以重新定位并重新调整它,那么你没事。 如果没有,你可以随时在superview的ViewController的循环callback被调用的时候做一个自定义的实现。
  • 你必须自己保留一个对ViewController的引用,否则它会立即被释放,而它的视图仍然会被它的超级视图所保留。

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

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

幸运的是,苹果已经做到了。 请观看WWDC 2011的“实现UIViewController Containment”video,以获取何时可用以及何时不可用的详细说明。

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

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

但是,不要滥用它。 你应该这样做的时候

  • 你正在实现一组控制器的容器(像你自己的UINavigationControllerUISplitViewController
  • 孩子控制器是独立的。 如果孩子们的控制器不断地调用父类的方法,反之亦然,那么在一个控制器中实现这个function会更好。

你可能会逃避,但可能有更好的办法。 认为两者都试图操纵这个观点似乎是合理的。 我的答案是否定的。

你想达到什么目的?

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

通常在Model-View-Controller体系结构中,我们可以重用视图。

但是对于UIViewController来说,可能并不总是好主意。 这可能会使项目体系结构变得复杂,因为按照苹果的文档视图与视图控制器紧密地绑定,所以它可能不易pipe理。

从UIViewController参考:视图控制器紧紧地绑定到他们pipe理的视图,并参与用于处理事件的响应者链。 视图控制器是UIResponder类的后代,并被插入pipe理的根视图和它的超级视图(通常属于不同的视图控制器)之间的响应者链中。 如果视图控制器的视图不处理事件,则视图控制器可以select处理事件,也可以将事件传递给超级视图。

但是,如果两个不同控制器的用户界面有细微差别,我认为我们可以重用视图。