前言
前几天和安卓的兄弟讨论一些问题,忽然被问及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呢?
此时瞬间感觉懵逼,也暴露平时知识掌握的不清楚的弱点,于是写了一个demo一探究竟
demo
demo的结构很简单,三个控制器,v, v1,v2,点击v跳转到v1,点击v1跳转到v2,然后pop会v,我们在每个控制器的viewWillAppear
中打印avigationController?.viewControllers
的数量,
如果是将A放至栈顶,则v2 pop 到 v的时候,那么栈内应该还有三个控制器,如果是弹栈的话,那么站内应该只剩一个,then ,do IT
结果
通过效果图可以看出,是通过弹栈实现的,其实我在打完这个demo之后,看到结果,然后在写博客开头的时候就大致想起来了,以前在学习时候,资料中反复确认iOS 导航栏是一种栈结构,push是入栈,pop是弹栈,弹栈的含义就是从栈中取出,导航栏中取出在声明周期中就已经game over了,所以不可能是在栈中调整顺序,所以知识还是需要多学,更重要的是多思考