Ios 如何通知父视图控制器为';的子视图控制器已删除自身?

Ios 如何通知父视图控制器为';的子视图控制器已删除自身?,ios,uiviewcontroller,Ios,Uiviewcontroller,子视图控制器由子视图控制器实现中的以下代码删除: - (void)commandFinishVC { [ self.view removeFromSuperview]; [ self removeFromParentViewController ]; } 已成功删除子视图控制器及其视图,但如何通知父视图控制器-未调用ViewDidEnglishe,并且已弃用-viewDidUnload 从我能找到的示例中,总是假设父视图控制器是指定要删除的子项的事件的发起人,但是(对我来说)子

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

- (void)commandFinishVC
{
    [ self.view removeFromSuperview];
    [ self removeFromParentViewController ];
}
已成功删除子视图控制器及其视图,但如何通知父视图控制器-未调用ViewDidEnglishe,并且已弃用-viewDidUnload

从我能找到的示例中,总是假设父视图控制器是指定要删除的子项的事件的发起人,但是(对我来说)子项应该在其完成逻辑上是自主的

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

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

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

我怀疑你可以摆脱你以前的做法,即孩子将自己移除,但苹果在他们的文档中是一致的,2011年的WWDC会议上说,容器管理员负责管理孩子

所以,在回答你的问题时,孩子是如何通知父母它已被移除的,没有既定的协议。但这并不奇怪,因为据推测,父母将启动这一过程。如果孩子需要启动这个过程,文档建议家长应该有一个管理孩子控制器的公共API

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

如果您正在实现自己的容器视图控制器,则必须先调用子视图控制器的
willMoveToParentViewController:
方法,然后再调用
removeFromParentViewController
方法

因此,正如《视图控制器编程指南》一节中所述,在移除子对象时,我们应该:

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

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

这背后的原因是使用VC(视图控制器)容器作为纯容器,没有属于它的视图。子容器中的视图具有其关联的事件;因此,子VC中的操作(例如,按下完成按钮)决定了子VC的释放。非常感谢您的回复,这确实有助于澄清我所阅读的内容。Rob,您知道willMoveToParentViewController:如果您没有在子视图控制器中重写该方法,是否确实有必要?苹果的文档让它听起来像你应该叫它,但我不知道它是否真的有什么作用,如果你不在你的孩子身上覆盖它。如果我不调用该方法,我没有看到任何问题。我很确定,它在其他苹果文档中声明,默认情况下,MoveToParentViewController不会执行任何操作,但我无法再次找到它。。。我也没有因为不调用它而遇到任何问题。@rdelmar我不知道如果你不调用这些方法会发生什么,但是文档说我们“必须”。(
transitionFromViewController
animation
块属于文档中“必需”的同一类所以,简而言之,是的,你是对的,文档中说我们必须调用这些方法,但这在实践中是否正确尚不清楚。就个人而言,如果文档说我们必须做一些事情(特别是像单个方法调用这样简单的事情),我通常是本着良好的防御性编程精神来做的。