didMoveToParentViewController 和 willMoveToParentViewController

didMoveToParentViewController and willMoveToParentViewController

关于 UIViewController 的 Apple 文档说:

如果你正在实现自己的容器视图控制器,它必须在调用removeFromParentViewController方法之前调用子视图控制器的willMoveToParentViewController:方法,传入一个父值nil。

当您的自定义容器调用 addChildViewController: 方法时,它会自动调用 willMoveToParentViewController: 视图控制器的方法,在添加它之前将其添加为子视图控制器。

如果您要实现自己的容器视图控制器,它必须在转换到新控制器完成后调用子视图控制器的 didMoveToParentViewController: 方法,或者如果没有转换,则在调用后立即调用addChildViewController: 方法。

removeFromParentViewController方法在移除子视图控制器后自动调用子视图控制器的didMoveToParentViewController:方法。

为什么要调用这些方法?这些方法有什么作用?

ProfileViewController *profile = [[ProfileViewController alloc] init];
profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:profile];
[self.view addSubview:profile.view];
[profile didMoveToParentViewController:self];

即使我删除了最后一行,我的代码也能完美运行。有人可以帮我吗?

提前致谢

使用这些方法是因为它是添加或删除子视图控制器时要遵循的规则。在添加子视图控制器之前,应首先调用 willMoveToParentViewController 方法,然后调用 didMoveToParentViewController 方法。从父视图控制器中删除子视图控制器时,将以相反的顺序调用这些方法。

addChildViewController: 自动调用 [child willMoveToParentViewController:self]。所以应该在 addChildViewController: 之后调用 didMoveToParentViewController。同样 removeFromParentViewController: 自动调用 [child didMoveToParentViewController:nil]。所以应该在 removeFromParentViewController:

之前调用 willMoveToParentViewController:

基本上,它们不会执行您可以在界面中注意到的任何操作。 "However, any subclass allows them to be overridden, so if you don't call them, you won't break a bare UIViewController, but you will break subclasses that rely on it (for instance: say a subclass wants to release an object when it is removed from a parent view controller, if you don't call the method, then it will never release the object)." 正如评论中所解释的那样 here