ios - 多个导航控制器之间的导航

2024-03-07

我试图理解使用(和不使用)NavigationController 在 ViewController 之间导航的行为,并且在阅读文章和文档时我误解了一些事情,所以我决定问他们。

主要问题是:如果故事板中有多个导航控制器并且想要从一个导航控制器转到另一个导航控制器,会发生什么情况?(这可以通过使用 segues 来实现,就像我们在普通 VC 之间所做的那样,对吗?)

据我了解,NavigationController 代表一堆 ViewController,我们可以在其中弹出和推送这些 VC。现在我们将“位置”从第一个 NavigationController 的 VC 更改为第二个 NavigationController 的 VC,接下来会发生什么?第一个堆栈消失了,现在我们只能在第二个堆栈中工作?如果是这样,是否意味着第一个 NavigationController 的 VC 堆栈已从内存中删除?

也许我完全误解了某些东西,或者也许没有:)。我很高兴看到您的回复,并希望向您询问有关导航机制的更多详细问题。

UPDATE

要点是:假设我们有一个(初始)VC,其中有两个按钮,代表应用程序的两个独立部分。接下来,我们单击第一个按钮并转到一个 NC 的 RootVC,然后返回到初始 VC,然后单击第二个按钮并转到另一个 NC。当我们回到初始 VC 时,第一个 NC 的堆栈发生了什么?从 NC“外部”到达初始 VC 的最佳方法是什么?

UPDATE

我试图了解内存发生了什么以及此时场景中有哪些 VC 等等。也许场景中是否有一些额外的 VC 绝对不重要,也许我们确实需要它们来更快地在 NC(或只是 VC)之间切换。所以我想了解它实际上是如何工作的。


想象一下,您有标准的应用程序链,您可以在初始导航控制器中推送/弹出视图。然后,假设您有不属于该链的不同视图,例如用户个人资料,您将其呈现为模态视图:

现在顶部导航控制器是初始的,因此您从这里开始,而为了使用第二个导航控制器,您必须通过 UIStoryboard 访问它,如下所示(红色箭头):

// Get storyboard
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())

// Get profile NC
let profileNC = storyboard.instantiateViewControllerWithIdentifier("LoginNC") as! UINavigationController

但是,如果您确实想从应用程序的某一部分呈现个人资料,因此它不是模态的,您也可以这样做(绿色箭头)。唯一的区别是,现在您不需要第二个导航控制器 - 因此您不需要将 Push Segue 连接到红色 NC,而是直接登录视图控制器。如果你真的尝试连接 NC - NC 然后运行它,你会得到运行时异常,说你做错了。

Memory

所有的 VC 都会留在记忆中,无论你如何呈现它们。当您将某些内容呈现为模态时,这也适用于背景视图。如果由于长链而出现内存问题,您可以在控制器中实现清理/缓存逻辑:

func viewWillAppear(animated: Bool) {

    // Call super first
    super.viewWillAppear(animated)

    // Prepare UI
}

func viewWillDisappear(animated: Bool) {

    // Call super first
    super.viewWillAppear(animated)

    // do some memory cleanup, since view will not be visible atm
}

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios - 多个导航控制器之间的导航 的相关文章

随机推荐

  • 宏元编程

    我知道这可能是坏的或不可能的 但由于这不是递归宏 我认为它应该是可能的 define FOO 15 define MAKE BAR x BAR x define MY FOO BAR MAKE BAR FOO 我希望 MY FOO BAR
  • 仅使用平移和旋转将一组 2d 点与另一组 2d 点对齐

    我正在 OpenCV 中工作 但我认为没有这方面的功能 我可以找到一个用于查找仿射变换的函数 但是仿射变换包括缩放 而我只想考虑旋转 平移 想象一下 我有两组 2d 点 假设每组恰好有 50 个点 例如 设 A x1 y1 x2 y2 x5
  • 颜色图中的 -Inf —— MATLAB 中低,Python 中高?

    我已将一些 MATLAB 代码移植到 Python 其中包括一个绘图实用程序 用于绘制 2D 矩阵 列表 中某些数据的颜色图 MATLAB 和 Python 绘图实用程序非常相似 因此我可以毫不费力地使它们在视觉上非常接近地匹配 我在这里使
  • getItemPosition 何时应考虑项目位置的更改?

    Android 的 PagerAdapter 类中 getItemPosition 方法的文档指出它是 当主视图尝试确定项目的位置是否已更改时调用 应该调用此方法来指示该适配器的项目组中的项目位置是否已更改 但是 它从未说明重写方法何时应考
  • 使用 sbt 将工件发布到 AWS CodeArtifact

    我正在尝试将工件发布到AWS CodeArtifact using sbt 但我遇到了一些麻烦 给定一个sbt项目 运行命令sbt publish包已上传到存储库 但仍保留在Unfinished状态 AWS CodeArtifact文档 h
  • 在远程机器上递归执行本地定义的python脚本

    我有兴趣编写一个脚本 以便该脚本的唯一副本驻留在我的本地计算机上 但该脚本在远程计算机上执行 可能远程计算机在其他远程计算机上执行该脚本 即 2 个或更多级别的分布式调用树中的递归 实现这一目标的一种方法是一步将脚本复制到远程计算机 然后在
  • ES6:“从'jquery'导入$”真正意味着什么?

    我一开始以为它只是意味着加载 jQuery 模块并在名为 的变量中初始化它 但是 通过将 Atom 与 A tom TypeScript 一起使用 我收到一条错误消息 指出 找不到模块 jquery 尽管所有代码都可以在浏览器中运行 但看起
  • Android - android.os.NetworkOnMainThreadException

    我有这个例外 我正在阅读关于此的线程 它似乎令人困惑 如何修复 android os NetworkOnMainThreadException https stackoverflow com questions 6343166 androi
  • 从 Javascript 对象创建 HTML 标签

    更改此对象的最佳方法是什么 src img jpg title foo 转化为有效的HTML 标签字符串像这样 img src img jpg title foo 解决方案1 使用 jQuery 这很容易 但很复杂 img attr obj
  • DefaultValue 属性反序列化

    我正在尝试将流反序列化为具有默认值属性的对象 并且当流中缺少这些属性时 protobuf net 只是忽略这些属性 在反序列化之前 我是否需要手动将所有属性设置为默认值 The DefaultValues行为 不仅仅是在 protobuf
  • StreamContent 和 ByteArrayContent webApi 的差异

    我在整个网络上进行了搜索 但找不到答案 我们的应用程序中有两种方法 a 第一个返回HttpResponseMessage里面有 1 个文件 它用StreamContent response Content new StreamContent
  • Javascript 中箭头函数(粗箭头=>)的确切解析优先级是什么?

    我遇到了一个例子eslint 文档 https eslint org docs rules no confusing arrow关于箭头函数 The intent is not clear var x a gt 1 2 3 所以我对箭头函数
  • 禁用 pylon 中的浏览器缓存

    我有一个操作 json 从服务器返回 json 不幸的是 在 IE 中 浏览器喜欢缓存这个 json 我怎样才能使该操作不缓存 确保您的响应标头具有 Cache Control no cache Pragma no cache Expire
  • 如何在 MySQL 中向值附加回车符?

    我正在导入一些餐厅信息 但发现我缺少描述字段中的菜肴类型 如何在值后面附加回车符 这就是我到目前为止所拥有的 我希望菜肴能换上新的路线 select concat field id 20 r french from table 如果您想要一
  • 使用 POI jar 获取 Excel SheetNames

    我需要使用 POI jar 的所有 Excel 工作表名称 所有包含数据的内容 像 jxl jar getSheetNames 你没有说你想要什么 所以我会猜测一个清单 您只需要迭代工作表索引 获取每个索引的名称 你的代码会是这样的 Fil
  • Selenium IDE 和 xpath - 在表中查找文本/行并选择单选框

    我一直在使用 Selenium IDE 并取得了一些不错的结果 我已经阅读了很多有关跟随兄弟姐妹和先前兄弟姐妹的内容 但我找不到正确的单选按钮 本质上 我想在表中找到带有 测试 一词的行 然后单击单元格中的单选按钮 到目前为止我可以找到输入
  • 如何将逗号分隔的字符串转换为列表?

    Java 中是否有任何内置方法允许我们将逗号分隔的字符串转换为某个容器 例如数组 列表或向量 或者我需要为此编写自定义代码吗 String commaSeparated item1 item2 item3 List
  • 希伯来语问题 - MySql,c#

    我在将希伯来语字符串插入 MySql 时遇到问题 介绍 我将MySql设置为Utf8 我将表设置为字符集 utf8 排序规则为 uft8 general ci 我将连接字符串设置为 Server 数据库 Uid Pwd 字符集 utf8 我
  • 打包一个可运行的 JPA jar,将 persistence.xml 放在外面

    我想将我的 jpa swing 项目导出到可运行的 jar 中 但我希望 persistence xml 位于 jar 之外而不是打包在里面 这样我就可以更改它 而无需在每次配置后再次导出 jar 根据 JPA 规范 persistence
  • ios - 多个导航控制器之间的导航

    我试图理解使用 和不使用 NavigationController 在 ViewController 之间导航的行为 并且在阅读文章和文档时我误解了一些事情 所以我决定问他们 主要问题是 如果故事板中有多个导航控制器并且想要从一个导航控制器