究竟是什么意志移动到一个明确的控件:和didMoveToParentViewController:做什么?

kon*_*rad 19 objective-c uiviewcontroller pushviewcontroller ios

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

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

Gui*_*ume 12

除了已经说过的内容之外,他们还调用了一些委托方法:

addChildViewController 电话 [child willMoveToParentViewController:self]

removeFromParentViewController:电话[child didMoveToParentViewController:nil]

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

  • 要清楚,UIViewController的`willMoveToParentViewController:`和`didMoveToParentViewController:`什么都不做.但是,任何子类都允许它们被覆盖,所以如果你不调用它们,你就不会破坏裸UIViewController,但是你会破坏依赖它的子类(例如:假设一个子类想要释放一个对象,它从父视图控制器中删除,如果你不调用该方法,那么它将永远不会释放该对象). (4认同)
  • 是的,我知道,'添加'和'删除'会自动调用一个方法(willMove ...和didMove ...分别)并要求您手动调用另一个方法.我认为理解什么是"添加"和"删除"都没有问题 - 这看起来很简单.我只是对'意志'和'做'实际做了什么感到有些困惑. (3认同)
  • `will`和`did`没有特定的实现,你在子控制器上调用它们,如果你没有,那么它们就不会被调用...如果子控制器可能会出现问题实施它们并依赖它们.在我的回答中,我错误地将它们称为"委托方法",但这几乎就是它们,它们作为可选的委托方法起作用,并且孩子可能会使用它们来进行一些设置或清理.任何UIViewController子类都可能会覆盖它们,如果你实现了一个容器控制器,你应该尊重这种行为并调用它们. (2认同)