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

时间:2013-01-04 22:25:11

标签: ios uiviewcontroller

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

- (void)commandFinishVC
{
    [ self.view removeFromSuperview];
    [ self removeFromParentViewController ];
}

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

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

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

- (void)commandFinishVC
{
    [ childVC.view removeFromSuperview];
    [ childVC removeFromParentViewController ];
}

1 个答案:

答案 0 :(得分:25)

是的,您的父控制器通常应该控制子控制器的添加和删除,因此您的第二种方法似乎更适用。请参阅 UIViewController类参考的Implementing a Container View Controller部分。

我怀疑你可以逃脱你以前的方法,孩子正在移除自己,但Apple的文档是一致的,而且Implementing UIViewController Containment上的WWDC 2011会话说容器管理员负责管理孩子。

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

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

  

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

因此,正如 View Controller编程指南的Adding and Removing a Child部分所述,在删除孩子时,我们应该:

[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];

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