我将继续不同意@St3fan,并使用UIKit作为反例。
然而,嵌入控制器的智慧(或缺乏智慧)通常应该以健全的 UI 设计原则为指导。
最简单的反例是嵌入在UITabBarControllers 中的UINavigationControllers。这些无处不在。就在我的脑海中,iPhone 上的 iPod 应用程序和 iPhone 上电话应用程序中的联系人。
我很好奇,懒得去检查他们对视图做了什么(添加到“超级控制器”视图或UIWindow。我很确定我会发现子控制器视图是视图层次结构中超级控制器视图的后代,这与 St3fan 的建议相反。
我创建了一个非常快速的 iPhone 应用程序,将所有内容都连接到 InterfaceBuilder 中,以创建一个带有两个选项卡的基于 UITabBarController 的应用程序,其中第一个是 UINavigationController,带有一个普通的 ole UIViewController 作为它的根视图控制器,和一个带有普通旧 UIViewController 的第二个标签,这样我就有了一个稍后可以点击的第二个标签。
添加一些NSLog 语句以输出我们看到的控制器的各种UIView's:
tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ...
navigationController.view = <UILayoutContainerView: 0x59469a0; ...
rootViewController.view = <UIView: 0x594bb70; ...
Superview: <UIViewControllerWrapperView: 0x594cc90; ...
Superview: <UINavigationTransitionView: 0x594a420; ...
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view
Superview: <UIViewControllerWrapperView: 0x594b430; ...
Superview: <UITransitionView: 0x5b0e110; ...
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view
Superview: <UIWindow: 0x5942a30; ...
以“Superview”为前缀的行是沿着rootViewController.view's superview 链向上直到达到 nil 的输出。
当然,快速浏览一下在根视图控制器上会调用viewDidDisappear 的几个地方的调用堆栈。
首先,在根控制器上调用 viewDidDisappear 时的调用堆栈,因为新控制器被压入堆栈:
-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...
二、在最顶层的UITabBarController中选择另一个tab时的调用栈:
-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
因此,在所有情况下,Apple 似乎都决定控制器应该在其嵌入式子控制器上调用各种viewDidAppear 等方法,并且应该以类似方式嵌入视图。我认为如果我们要将UIKit 设计作为一个很好的线索,那么 OP 就在头上一针见血。