导航控制器中导航堆栈使用的数据类型是啥
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 有两种表示形式,一种是数组,另一种是链表。 所以 push 和 pop 操作在这里使用 Array 执行,使用 :-
pushViewController(_:animated:)
popViewController(animated:)
您的第二个问题的答案 - 导航控制器的 TopViewController 表示堆栈顶部的视图控制器,而 RootViewController 是堆栈上的第一个视图控制器
希望这会有所帮助!
【讨论】:
@Aditay Srivastava 是的,它确实有很大帮助,谢谢!以上是关于导航控制器中导航堆栈使用的数据类型是啥的主要内容,如果未能解决你的问题,请参考以下文章
刷新 UINavigationController 中的“根”数据并更新导航堆栈中的数据
将 UITableViewController 推送到导航堆栈时看不到导航栏