我知道从iOS5和新的UIViewController包含方法开始,您应该将这些方法与 addChildViewController:, removeFromParentViewController:和转换方法一起调用。我也知道在三种情况下调用它们的正确顺序。我不知道这些方法到底是做什么的?
如果这些只是UIViewController子类的覆盖点,我想我们在覆盖时不需要调用 super 。如果在删除视图控制器或 didMoveToParentViewController:self 之前没有调用 willMoveToParentViewController:nil ,会出现什么/将会出错?
答案 0 :(得分:13)
除了已经说过的内容之外,他们还会调用一些委托方法:
addChildViewController
来电[child willMoveToParentViewController:self]
和removeFromParentViewController:
来电[child didMoveToParentViewController:nil]
此外,他们还修改了childViewControllers
属性,该属性包含一组子视图控制器。
答案 1 :(得分:1)
有很多答案:
他们在那里你应该在适用的地方打电话给他们,以便始终坚持这种模式。这样,如果您将超类从UIViewController
更改为您自己的视图控制器,您就不必担心整个模式的位置。
他们是更好的地方,而不是告诉所有人覆盖addChildViewController:
。正如您所说,错误管理willMoveToParentViewController:
听起来比错误管理addChildViewController:
更不危险,特别是如果您忘记拨打super
。
UIViewController
可能取决于你坚持这种模式。如果它知道它已经收到addChildViewController:
但是从未得到其他两条消息,它可能会认为状态不一致。这是因为UIViewController
做书记以引诱你坚持完整模式,还是你真的搞砸了它的内部状态,这是一个有趣的猜谜游戏,但也可能在任何iOS版本中发生变化。事情可能会严重破坏。这就是为什么这种模式存在的原因,因为Apple告诉你,只要你这样做,无论如何我们都会保持工作。
质疑模式是好的,但是尝试削减模式与骨骼的一致性会产生许多潜在的负面影响。除非模式涉及到荒谬,否则通常更容易符合它。