20

我知道从 iOS5 和新的 UIViewController 包含方法开始,您应该将这些方法与addChildViewController:removeFromParentViewController:和转换方法一起调用。我也知道在三种情况下调用它们的正确顺序。我不知道这些方法到底是做什么的?

如果这些只是 UIViewController 子类的覆盖点,我想我们在覆盖时不需要调用super。如果我在删除视图控制器或didMoveToParentViewController: self之前不调用willMoveToParentViewController: nil会出现什么问题?

4

2 回答 2

12

除了已经说过的,它们确实调用了一些委托方法:

addChildViewController来电[child willMoveToParentViewController:self]

removeFromParentViewController:打电话[child didMoveToParentViewController:nil]

此外,他们修改了childViewControllers属性,该属性包含一组子视图控制器。

于 2012-10-16T08:20:25.447 回答
1

对此有很多答案:

  1. 他们在那里,你应该在适用的地方称呼他们,以始终坚持这种模式。这样,如果您将超类更改UIViewController为您自己的视图控制器,您就不必担心您在哪里遵循了整个模式。

  2. 它们是比告诉每个人都覆盖更好的地方addChildViewController:。正如你所说,管理不善willMoveToParentViewController:听起来不像管理不善那么危险addChildViewController:,特别是如果你忘记打电话super

  3. UIViewController可能取决于你坚持的模式。如果它知道它已经收到addChildViewController:但从未收到其他两条消息,它可能会认为状态不一致。发生这种情况是因为UIViewController做簿记以诱使您坚持完整的模式,还是您真的弄乱了它的内部状态,这是一个有趣的猜谜游戏,但在任何 iOS 版本中都可能发生变化。事情可能会很糟糕。这就是为什么存在这种模式的原因,Apple 告诉你,只要你这样做,无论如何我们都会保持工作正常。

质疑一个模式是好的,但有很多潜在的负面影响试图削减你对模式的一致性。除非模式被荒谬地涉及,否则通常更容易符合它。

于 2012-10-16T08:11:31.197 回答