使用 UINavigationController 管理 UIViewController 层次结构

Posted

技术标签:

【中文标题】使用 UINavigationController 管理 UIViewController 层次结构【英文标题】:Managing UIViewController Hierarchies with UINavigationController 【发布时间】:2013-08-21 09:49:52 【问题描述】:

我是一名新的 ios 开发人员,受委托开发我的第一个 iPhone 应用程序。

我有点不确定在两个级别的视图控制器层次结构之间导航的正确方法。我使用带有 UINavigationController 的工具栏在第一级的 5 个视图控制器之间导航。

我需要此顶层的工具栏按钮之一导航到应位于同一级别(第 2 级)的 6 个相关视图控制器中的任何一个(哪个由此级别的先前用户活动确定)。在这些视图控制器中,工具栏应该提供按钮,用于将控制权转移到该级别的每个其他视图控制器,但不要将它们推送到该级别先前查看的视图控制器下方的导航控制器堆栈上。即我希望导航控制器后退按钮直接返回到顶层,但是已经查看了许多第二级视图控制器。我该怎么做?

我希望我的问题可以理解。毫无疑问,答案很简单。感激地收到任何建议。

【问题讨论】:

【参考方案1】:

我认为您可以尝试UITabBarController 用于同一级别的视图控制器。

编辑:对于在 Navigationcontroller 中使用 UITabBarController,请检查这些 SO POST 1

SO POST 2

【讨论】:

我看过与 UITabBarController 相关的帖子,这些帖子表明需要在 appDelegate 中将其设置为根视图控制器,并将导航控制器作为子视图。我假设这在顶层有效。是否可以只在第 2 级添加标签栏。如果可以,我将其添加到什么位置? 另一种选择是使用 UITableView 作为菜单导航到不同的视图控制器。 感谢您使用 SO 讨论链接进行编辑。在这些讨论中的某个地方是正确的解决方案。 在阅读了这些讨论之后,我决定以模态方式访问第二层,使用标签栏在该层的视图控制器之间移动。这样,我(希望)坚持 Apple 的设计准则。 我实际上做的是使用视图控制器包含,以及一个新的父视图控制器,称为模态,过渡到由父级中的分段控件控制的六个子级。【参考方案2】:

从工具栏进入控制器后,调用该函数删除导航栈

- (void)removeNavigationStack

    NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
    [controllers removeObjectsInRange:NSMakeRange(1, controllers.count-2)];
    self.navigationController.viewControllers = controllers;


【讨论】:

以上是关于使用 UINavigationController 管理 UIViewController 层次结构的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController