ios导航栏栈结构的一点理解

前言

前几天和安卓的兄弟讨论一些问题,忽然被问及iOS 导航栏的结构,虽然明确知道是栈结构,但是比如A push B push C push D pop A(或者pop B),这样一个简单的结构,那么pop到A的时候我们通常的做法是这样

for item in (navigationController?.viewControllers)! {
            if item.isKind(of: ViewController.self){
                navigationController?.popToViewController(item, animated: true)
            }
        }

在栈中先找到要pop的控制器,然后pop。那么此时被安卓的兄弟问了一个有意思的问题,此时是将A直接放到了栈顶,还是将B 和 C进行了弹栈之后到达的A呢?


ios导航栏栈结构的一点理解_第1张图片

此时瞬间感觉懵逼,也暴露平时知识掌握的不清楚的弱点,于是写了一个demo一探究竟

demo

demo的结构很简单,三个控制器,v, v1,v2,点击v跳转到v1,点击v1跳转到v2,然后pop会v,我们在每个控制器的viewWillAppear中打印avigationController?.viewControllers的数量,

ios导航栏栈结构的一点理解_第2张图片
demo结构

如果是将A放至栈顶,则v2 pop 到 v的时候,那么栈内应该还有三个控制器,如果是弹栈的话,那么站内应该只剩一个,then ,do IT
ios导航栏栈结构的一点理解_第3张图片
运行图

结果

通过效果图可以看出,是通过弹栈实现的,其实我在打完这个demo之后,看到结果,然后在写博客开头的时候就大致想起来了,以前在学习时候,资料中反复确认iOS 导航栏是一种栈结构,push是入栈,pop是弹栈,弹栈的含义就是从栈中取出,导航栏中取出在声明周期中就已经game over了,所以不可能是在栈中调整顺序,所以知识还是需要多学,更重要的是多思考

你可能感兴趣的:(ios导航栏栈结构的一点理解)