编写父视图控制器的最终指南

时间:2011-05-16 15:48:38

标签: iphone ios ipad uiviewcontroller

短版

如果我正在编写自己的自定义拆分视图控制器,我需要做些什么才能使子视图控制器按预期工作?

例如:发送viewWillAppear:等等。

长版

背景

前段时间我回答了以下问题:
Switch between UIViewControllers using UISegmentedControl

通过以下答案:

  

正确的做法是让控制器处理UISegmentedControl将控制器的视图添加为子视图。

[self.view addSubview:controller.view];
     

您有责任发送viewWillAppear:等等。

然而,tc。指出这并不像听起来那么简单:

  

没有。视图控制器不应该像这样使用 - 控制器将错过很多被认为是理所当然的UIViewController魔法(即-view {Will,Did} {Appear,Disappear}:和-shouldRotateToViewOritentation :)。

     

通过“魔术”,我指的是UIKit在幕后所做的一切。您还忘记了-parentViewController(这对于模态视图控制器这样的事情很重要)。此外,在UIKit深处的某个地方,它会自动调用-viewSomethingSomething:为你,所以你可能会得到-viewDidDisappear:两次! (我不记得确切的细节,但还有另一个用户报告你需要做的就是调用-viewWillAppear:其他三种方法自动发生。)关键问题是Apple没有记录“魔法”或它如何在操作系统更新之间发生变化。

从那时起,我一直在考虑应该为父视图控制器中需要存在的内容编译指南,以便子视图控制器按预期工作。 Apple的文档并没有涵盖这一点,Google也没有帮助,所以现在我希望在stackoverflow社区中找到这些知识。

我写了几个像这样的控制器,它们似乎都有效,但我不禁想知道我是否错过了重要的控制器魔法。

1 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是“不要那样做”。而不是希望您可以复制所有UIViewController的行为而不会因使用私有API调用而被拒绝,为什么不创建非UIViewController控制器对象来管理您的子视图? “控制器”不一定是UIViewController

至少您需要覆盖或混合使用parentViewControllersplitViewControllernavigationControllertabBarControllerinterfaceOrientation的替代getter(可能还modalViewController)。对于每个属性,您需要确保UIKit调用的任何私有setter仍然按预期工作,并且通过直接修改UIViewController ivars对这些值所做的任何更改也会在您的实现中正确反映。

您还需要弄清楚UIKit如何确定哪个UIViewController当前处于活动状态并且应该接收视图控制器生命周期方法,因为您需要确保将这些方法发送到容器视图控制器而不仅仅是其中一个。孩子。

您还必须希望您不仅构建了Apple的任何视图控制器类都不支持的情况。例如,如果他们有parentViewController但他们的navigationControllertabBarControllersplitViewController都是零,那么他们中的任何一个都会中断吗?

最后,您需要跟上每个iOS版本对这些私有实现细节的任何更改。