2012-02-23 61 views

回答

6

苹果,因此大多数人遵循苹果的指导方针会告诉你这是不好的做法,苹果公司为此增加了ViewController遏制(childViewControllers)。不幸的是,大多数人盲目地遵循这一点,并不会告诉你为什么这是不好的做法。我很高兴你能问这个问题。

事实是,在模型 - 视图 - 控制器架构,视图应该是可重复使用的,无论它们所包含的内容,因此,视图和控制视图的内容不应该是相同的对象。在iOS5之前,UIViewController究竟是如何实现的?Apple不鼓励你在多次使用中使用它们,而这是一件非常合乎逻辑的事情。当然这是令人困惑的,许多人无视这些指导方针,无论如何,包括我自己在内,应用程序运行良好,并通过了应用商店验证,这导致了更多的混淆。 结果是,直到今天,人们仍然在苹果崩溃并给了我们自定义容器ViewControllers一年多之后提出问题。我已经看到人们经常用复杂的答案回答这个问题,至于重新创建UIViewController作为一个从NSObject继承的非常简单的问题。只是因为苹果不鼓励使用UIViewControllers,甚至不知道为什么。

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

这里是你期待什么,如果你只需添加一个视图控制器的看法,另一种观点:不能保证

  • 查看回调方法被调用。诸如viewWillAppear,viewDidAppear,viewWillDisappear和viewDidDisappear之类的方法可能会也可能不会被调用。它在很大程度上取决于操作系统的版本,在iOS4中它们永远不会被调用,在iOS5和更高版本中,它们大多会被调用。所以你不能重写这些方法,因为你不能依赖它们,你无法控制它们何时,如果或多少次被调用。
  • 唯一视图回调方法,将始终得到正确叫法viewDidLoad中。
  • 旋转回调不会被调用。根据你的情况,这可能是一件大事,或根本不重要。如果视图的自动恢复掩码足以重新定位并重新调整它,那么你很好。如果没有,你可以随时在超级视图的ViewController的循环回调被调用时做一个自定义的实现。
  • 你必须保持到ViewController自己的引用,否则它会立即得到释放,而其视图仍将受到它的父被保留。

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

+0

+1“查看回调方法不保证能够被调用”当我试图找出为什么不调用回调函数时,我有一段有趣的时间。结果?我在一个'UINavigationController'里有我的控制器,这个行为很奇怪。 – Sulthan 2012-11-21 09:25:21

0

你可能会得到它,但可能有更好的方法。认为两者都试图操纵观点似乎是合理的。我的回答是否定的。

你想完成什么?

+0

我不要求任何特定的目的。但为什么你不建议这个? – Krishnan 2012-02-23 09:33:06

+0

你错了,这是儿童视图控制器的重点。 – Sulthan 2012-02-23 10:44:33

0

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

+1

他的意思是,可以用'addSubview:'添加视图。什么类变量与此有关? – mattjgalloway 2012-02-23 08:56:17

3

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

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

0

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

但是对于UIViewController,它可能并不总是好主意。这可能会使项目体系结构变得复杂,因为按照Apple文档,视图与视图控制器紧密相连,所以它可能不易管理。

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

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

1

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

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

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

  • 你(你自己喜欢的UINavigationControllerUISplitViewController东西)实现了一组控制器的容器
  • 孩子控制器是独立的。如果儿童控制器不断地调用其父对象的方法,反之亦然,那么在一个控制器中实现该功能将是一个更好的主意。
相关问题