窗口上导航控制器中最顶层的视图控制器下面是什么? (它是导航堆栈中的“导航控制器”还是“俯视图控制器下方的视图控制器”?)
OR
导航控制器上的所有视图控制器是否同时存在于电话窗口中,或者堆栈是否维护对它们的引用,并且在调用推送和弹出操作时它们会被加载和卸载?
答案 0 :(得分:1)
你的问题似乎令人困惑,但正如我所理解的那样,app层次结构被描述为
答案 1 :(得分:1)
您正在尝试将视图与ViewControllers的理解混合在一起,有时我们不会注意这些。
手机窗口上的所有视图控制器是否同时存在于另一个
之下
从渲染的角度来看,Window托管视图,而不是视图控制器。因此,当通过推/弹出生成导航堆栈时,窗口托管导航控制器的视图,该导航控制器是它的根控制器对象。
导航控制器对象本身由UINavigationBar
和content view
组成,它承载子控制器的视图。
现在出现的问题是,如何维护视图和视图控制器的层次结构。 UINavigationController
一次托管一个视图,因此即使堆栈上有多个控制器,也只会在视图层次结构中加载最顶层的控制器视图。所以视图堆栈就像
window->navigationControllerView->topMostControllerView
对于视图控制器的层次结构,除非向导航控制器发送弹出消息,否则它们将保持在堆栈上并保持活动状态。有时它们可能会在收到内存警告时被销毁。有关其他详细信息,请参阅Documentation
为了说明这一点,我生成了一个简单的堆栈跟踪。如果您查看对象0x7a6cfd60
,这是最顶层控制器MyDocumentsVC的视图(查看底线),并作为UIViewControllerWrapperView
的单个子视图出现,这只是导航的内容视图控制器。
(lldb) po [[self.navigationController view] subviews]
<__NSArrayM 0x7bad3bf0>(
<UINavigationTransitionView: 0x7bad3a10; frame = (0 0; 768 1024); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7bad3bc0>>,
<UINavigationBar: 0x7b960780; frame = (0 20; 768 44); opaque = NO; autoresize = W; gestureRecognizers = <NSArray: 0x7a69ec40>; layer = <CALayer: 0x7b960300>>
)
(lldb) po [[[[self.navigationController view] subviews] objectAtIndex:0] subviews]
<__NSArrayM 0x7baf59f0>(
<UIViewControllerWrapperView: 0x7a6c2290; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x7a6c2360>>
)
(lldb) po [[[[[[self.navigationController view] subviews] objectAtIndex:0] subviews] objectAtIndex:0] subviews]
<__NSArrayM 0x7a6ec3f0>(
<UIView: 0x7a6cfd60; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x7a6cfdd0>>
)
(lldb) po [self.navigationController viewControllers]
<__NSArrayI 0x7a6e9c20>(
<ViewController: 0x7b956820>,
<MyDocumentsVC: 0x7b96bc30>
)
(lldb) po [[[self.navigationController viewControllers] objectAtIndex:0] view]
<UIView: 0x7a6b68c0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x7a6b6930>>
(lldb) po [[[self.navigationController viewControllers] objectAtIndex:1] view]
<UIView: 0x7a6cfd60; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x7a6cfdd0>>
答案 2 :(得分:0)
除了UINavigationController
堆栈上最顶层的viewcontroller之外的其他视图控制器的视图只要需要就存在,并且可以在收到内存警告时被销毁(如果它们没有强引用,这是非常罕见的并且需要一些特例)。