导航控制器中导航堆栈使用的数据类型是啥

Posted

技术标签:

【中文标题】导航控制器中导航堆栈使用的数据类型是啥【英文标题】:What's the data type used by navigation stacks in the navigation controller导航控制器中导航堆栈使用的数据类型是什么 【发布时间】:2017-08-12 14:53:12 【问题描述】:

导航控制器对象管理当前显示的屏幕 使用 导航堆栈,它由视图数组表示 控制器。

报价和图均来自苹果official document。引用中提到了 navigation stack 这两个词,而该图实际上将 NSArray 指向了 Navigation stack。

而且这个描述开始让我感到困惑

数组中的第一个视图控制器是根视图控制器。 数组中的最后一个视图控制器是当前的视图控制器 正在显示

引用描述了属于堆栈数据类型的特征,另外,它们确实有 push segue 存在于 StoryBoard 中。似乎 UINavigationController 确实使用堆栈数据类型而不是数组/NSArray 数据类型。

问题 1

导航控制器的导航栈使用的数据结构究竟是什么,Stack还是Array

问题 2

导航控制器中的topViewController和rootViewController有什么区别

【问题讨论】:

【参考方案1】:

问题 1 ViewControllers 属性在UINavigationController 定义中定义为 NSArray,但具有 popViewController 方法和 pushViewController 方法等堆栈行为,但您也可以通过新的 Array ViewControllers 数组修改 ViewControllers 数组

@property(nonatomic,copy) NSArray<__kindof UIViewController *>*viewControllers; // The current view controller stack.

2 堆栈行为方法示例

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
//Others
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated
//Others

但您也可以使用此方法设置 ViewControllers 数组

- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated;

问题 2

TopViewController 是您看到的当前 viewController,rootViewController 是第一个添加到导航堆栈的ViewController

【讨论】:

非常感谢您的帮助 很高兴帮助你@SLN【参考方案2】:

您的第一个问题的答案是 NavigationStack 使用堆栈数据结构的 数组表示。我认为 Stack 有两种表示形式,一种是数组,另一种是链表。 所以 pushpop 操作在这里使用 Array 执行,使用 :-

pushViewController(_:animated:)
popViewController(animated:)

您的第二个问题的答案 - 导航控制器的 TopViewController 表示堆栈顶部的视图控制器,而 RootViewController 是堆栈上的第一个视图控制器

希望这会有所帮助!

【讨论】:

@Aditay Srivastava 是的,它确实有很大帮助,谢谢!

以上是关于导航控制器中导航堆栈使用的数据类型是啥的主要内容,如果未能解决你的问题,请参考以下文章

刷新 UINavigationController 中的“根”数据并更新导航堆栈中的数据

在堆栈中嵌入 2 个或更多导航控制器

使用委托将数据传回导航堆栈

将 UITableViewController 推送到导航堆栈时看不到导航栏

使用 overCurrentContext 呈现视图控制器,然后推送到导航堆栈会导致导航栏重叠

如何在不使用导航栏的情况下从导航堆栈中弹出控制器