子视图控制器的实现中的以下代码删除了子视图控制器:
- (void)commandFinishVC
{
[ self.view removeFromSuperview];
[ self removeFromParentViewController ];
}
子视图控制器及其视图已成功删除,但父母如何通知此情况? -viewDidDisappear未被调用且-viewDidUnload已被弃用。
从我可以找到的例子中,总是假设父视图控制器是提名被删除子项的事件的发起者,但是(对我来说)孩子应该在其完成逻辑中自主。
是否应该通过利用self.parentViewController属性并在父视图控制器中使用类似以下内容来调用remove方法?
- (void)commandFinishVC
{
[ childVC.view removeFromSuperview];
[ childVC removeFromParentViewController ];
}
答案 0 :(得分:25)
是的,您的父控制器通常应该控制子控制器的添加和删除,因此您的第二种方法似乎更适用。请参阅 UIViewController类参考的Implementing a Container View Controller部分。
我怀疑你可以逃脱你以前的方法,孩子正在移除自己,但Apple的文档是一致的,而且Implementing UIViewController Containment上的WWDC 2011会话说容器管理员负责管理孩子。
因此,在回答您关于孩子如何通知父母已被移除的问题时,没有建立的协议。但这并不令人惊讶,因为假设父母将启动这一过程。如果孩子需要启动此过程,文档建议父母应该有一个公共API来管理子控制器。
因此,虽然没有通知父母的子协议,但是有一个已发布的API,父控制器通过该API告知孩子他们已被移动/移除。具体来说,当父控制器删除子节点时,它应该调用willMoveToParentViewController
。 This documentation明确表示我们必须执行此通知:
如果要实现自己的容器视图控制器,则必须在调用
willMoveToParentViewController:
方法之前调用子视图控制器的removeFromParentViewController
方法...
因此,正如 View Controller编程指南的Adding and Removing a Child部分所述,在删除孩子时,我们应该:
[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];
不出所料,didMoveToParentViewController
的文档同样明确:添加子控制器时,必须在动画/转换(如果有)完成时调用didMoveToParentViewController
。我不知道如果我们不调用这两种通知方法会发生什么,但Apple说我们必须这样做,因此这样做似乎是谨慎的。