如何通知父视图控制器的子视图控制器已自行删除?

Rod*_*ddy 17 uiviewcontroller ios

子视图控制器的实现中的以下代码删除了子视图控制器:

- (void)commandFinishVC
{
    [ self.view removeFromSuperview];
    [ self removeFromParentViewController ];
}
Run Code Online (Sandbox Code Playgroud)

子视图控制器及其视图已成功删除,但父母如何通知此情况?-viewDidDisappear未被调用,并且已弃用-viewDidUnload.

从我可以找到的例子中,总是假设父视图控制器是提名被删除的孩子的事件的发起者,但是(对我来说)孩子应该在其完成的逻辑中是自主的.

是否应该通过利用self.parentViewController属性并在父视图控制器中使用类似以下内容来调用remove方法?

- (void)commandFinishVC
{
    [ childVC.view removeFromSuperview];
    [ childVC removeFromParentViewController ];
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 25

是的,您的父控制器通常应该控制子控制器的添加和删除,因此您的第二种方法似乎更适用.请参阅UIViewController类参考实现容器视图控制器部分.

我怀疑你可以逃脱你以前的方法,孩子正在移除自己,但Apple的文档是一致的,WWDC 2011 实施UIViewController Containment会议说容器控制器负责管理孩子.

因此,在回答您关于孩子如何通知父母已被删除的问题时,没有建立的协议.但这并不令人惊讶,因为假设父母将启动这一过程.如果孩子需要启动此过程,文档建议父母应该有一个用于管理子控制器的公共API.

因此,虽然没有儿童通知父母的协议,但是有一个已发布的API,父控制器通过该API告知儿童他们已被移动/移除.具体来说,当父控制器正在删除子节点时,它应该调用willMoveToParentViewController.该文档明确说明我们必须执行此通知:

如果要实现自己的容器视图控制器,则必须willMoveToParentViewController:在调用removeFromParentViewController方法之前调用子视图控制器的方法...

因此,如" View Controller编程指南"的" 添加和删​​除子"部分所述,在删除子节点时,我们应该:

[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];
Run Code Online (Sandbox Code Playgroud)

不出所料,文档didMoveToParentViewController同样明确:当您添加子控制器时,必须didMoveToParentViewController在动画/转换(如果有)完成时调用.我不知道如果我们不调用这两种通知方法会发生什么,但Apple说我们必须这样做,因此这样做似乎是谨慎的.