gpt4 book ai didi

ios - 导航 Controller : What is below the topmost view controller in navigation controller on the window?

转载 作者:行者123 更新时间:2023-11-29 10:30:04 25 4
gpt4 key购买 nike

窗口上导航 Controller 中最顶层的 View Controller 下面是什么?(它是导航堆栈中的“导航 Controller ”还是“顶部 View Controller 下方的 View Controller ”?)

手机窗口上的所有 View Controller 是否同时在导航 Controller 上一个下一个地显示,或者堆栈维护对它们的引用并在调用推送和弹出操作时加载和卸载它们?

最佳答案

您试图将对 Views 的理解与 ViewControllers 混为一谈,而我们有时并没有注意到这一点。

Are all the view controllers present on the phone window simultaneously one below the other

从渲染的角度来看,Window 在其之上托管 View ,而不是 View Controller 。因此,当通过 push/pops 生成导航堆栈时,一个窗口承载导航 Controller 的 View ,它是它的根 Controller 对象。

导航 Controller 对象本身由一个 UINavigationBar 和一个 content view 组成,它承载子 Controller 的 View 。

现在问题来了,如何维护 View 和 View Controller 的层次结构。 UINavigationController 一次承载一个 View ,因此即使堆栈上有多个 Controller , View 层次结构中也只会加载最顶层 Controller 的 View 。所以 View 堆栈类似于

window->navigationControllerView->topMostControllerView

至于 View Controller 的层次结构,它们在堆栈上维护并保持事件状态,除非将弹出消息发送到导航 Controller 。有时它们会在收到内存警告时被销毁。引用Documentation其他细节

为了说明这一点,我生成了一个简单的堆栈跟踪。如果您查看对象 0x7a6cfd60,这是最顶层 Controller MyDocumentsVC 的 View (查看底线)并且作为 UIViewControllerWrapperView 的单个 subview 存在,这没什么但是导航 Controller 的内容 View 。

(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>>

关于ios - 导航 Controller : What is below the topmost view controller in navigation controller on the window?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com