根视图控制器的确切含义

Posted

技术标签:

【中文标题】根视图控制器的确切含义【英文标题】:The exact meaning of root view controller 【发布时间】:2019-12-16 13:37:04 【问题描述】:

我从 Apple 官方文档 Start Developing ios Apps 中阅读了以下内容:

由特定导航控制器管理的视图控制器集称为其导航堆栈。添加到堆栈的第一项成为根视图控制器,并且永远不会从导航堆栈中弹出(移除)。

但在 Apple View Controller Programming Guide for iOS 的另一个官方文档和网上的许多其他文档中,我读到根视图控制器是根视图的控制器,是添加到窗口的第一个视图。

根视图控制器是视图控制器层次结构的锚。每个窗口只有一个根视图控制器,其内容填充该窗口。

那么,在导航视图控制器的情况下,导航视图控制器不应该是根视图控制器吗?为什么上面的第一个文档说它的子视图控制器是根视图控制器?我错过了什么吗?感谢您的任何解释。

【问题讨论】:

我完全同意对两个完全不同的事物使用相同的术语(究竟是什么的“根”?)是不幸的。然而,这在实践中不是问题。 @matt 对于像我这样的初学者在实践中是个问题,因为我不得不停止阅读并要求澄清 SO :) 话虽如此,我很高兴我得到了这里的人的帮助。跨度> 【参考方案1】:

你混合了两种不同的东西。在navigation stack 的情况下,根控制器位于堆栈的根目录,但在window 的情况下,rootViewController 是您的应用启动时出现的第一个视图控制器。虽然在这两种情况下您都可以更改 root。

再次在navigationController 的情况下,当你说它自己的应该是根而不是它的第一个孩子时,你基本上是在伪造苹果的第一条陈述,这是真的,你不能弹出导航的根。 Navigation Controller 不是我们常用的控制器,它就像一个容器,其中包含路由的整个控制器堆栈。 rootViewController之后可以来回,但不能返回。

两者都是用相同名称引用的不同事物。我认为导航的 rootViewController 以 iOS 的方式出现在窗口出现之前。虽然它的引用名称有些正确,但想要更改应用程序的整个层次结构更改活动窗口的根就像想要更改整个导航堆栈一样,更改导航的根。

【讨论】:

如果我理解你所说的正确,这两个文档的作者使用阶段(“根视图控制器”)来表示不同的含义,对吧?这就是我在发布问题之前的想法。如果是这样,那就太令人困惑了,我不明白为什么 UIKit 文档编写者会这样做。此外,我认为说“rootViewController 是您的应用启动时出现的第一个视图控制器”并不准确。在我看来,根视图控制器是窗口第一个直接视图的控制器。 谢谢。这就是我正在寻找的确认。

以上是关于根视图控制器的确切含义的主要内容,如果未能解决你的问题,请参考以下文章

更改 iOS 窗口的根视图控制器

重新加载根视图控制器

为视图控制器根视图设置外观代理

动态设置拆分视图控制器为根视图控制器IOS

子视图控制器关闭后重新加载根视图控制器

iOS 编程:关于根视图控制器的说明