UIViewController
上的Apple文档说:
如果要实现自己的容器视图控制器,则必须在调用willMoveToParentViewController:
方法之前调用子视图控制器的removeFromParentViewController
方法,并传递父值为nil。
当您的自定义容器调用addChildViewController:
方法时,它会自动调用视图控制器的willMoveToParentViewController
:方法作为子项添加,然后再添加它。
如果要实现自己的容器视图控制器,则必须在转换到新控制器完成后调用子视图控制器的didMoveToParentViewController:
方法,或者如果没有转换,则在调用{ {1}}方法。
addChildViewController:
方法在删除子视图后自动调用子视图控制器的removeFromParentViewController
方法。
为什么要调用这些方法?这些方法有什么作用?
didMoveToParentViewController:
即使我删除了最后一行,我的代码也能正常运行。有人可以帮我吗?
提前致谢
答案 0 :(得分:22)
使用这些方法是因为在添加或删除子视图控制器时应遵循该规则。在添加子视图控制器之前,应首先调用willMoveToParentViewController
方法,然后调用didMoveToParentViewController
方法。从父视图控制器中删除子视图控制器时,将以相反的顺序调用这些方法。
addChildViewController:
会自动调用[child willMoveToParentViewController:self]
。因此,应在didMoveToParentViewController
之后致电addChildViewController:
。同样,removeFromParentViewController:
会自动调用[child didMoveToParentViewController:nil]
。因此,应在willMoveToParentViewController:
removeFromParentViewController:
答案 1 :(得分:2)
基本上,他们不会做任何你在界面中注意到的事情。 "但是,任何子类都允许它们被覆盖,所以如果你不打电话给它们,你就不会打破一个简单的UIViewController,但你会破坏依赖它的子类(例如:说一个子类想要在从父视图控制器中删除它时释放一个对象,如果你不调用该方法,那么它将永远不会释放该对象)。"正如评论here中所解释的那样。