didMoveToParentViewController和willMoveToParentViewController

时间:2015-08-20 09:13:08

标签: ios objective-c iphone uiviewcontroller

UIViewController上的Apple文档说:

如果要实现自己的容器视图控制器,则必须在调用willMoveToParentViewController:方法之前调用子视图控制器的removeFromParentViewController方法,并传递父值为nil。

当您的自定义容器调用addChildViewController:方法时,它会自动调用视图控制器的willMoveToParentViewController:方法作为子项添加,然后再添加它。

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

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

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

didMoveToParentViewController:

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

提前致谢

2 个答案:

答案 0 :(得分:22)

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

addChildViewController:会自动调用[child willMoveToParentViewController:self]。因此,应在didMoveToParentViewController之后致电addChildViewController:。同样,removeFromParentViewController:会自动调用[child didMoveToParentViewController:nil]。因此,应在willMoveToParentViewController:

之前致电removeFromParentViewController:

答案 1 :(得分:2)

基本上,他们不会做任何你在界面中注意到的事情。 "但是,任何子类都允许它们被覆盖,所以如果你不打电话给它们,你就不会打破一个简单的UIViewController,但你会破坏依赖它的子类(例如:说一个子类想要在从父视图控制器中删除它时释放一个对象,如果你不调用该方法,那么它将永远不会释放该对象)。"正如评论here中所解释的那样。