出栈操作
-
popViewControllerAnimated:
返回上一级 -
popToRootViewControllerAnimated:
返回根控制器 -
popToViewController: animated:
返回到指定的子控制器
-
通过示例,来熟悉出栈的几个方法
-
分析
- 层级:"红色(第1层) -->黄色(第2层)-->绿色(第3层)-->桔色(第4层)"
- 各个层级
- 点击"下一级控制器"按钮,
- pushViewController: animated:
(入栈操作) - 点击"控制器数量"按钮,打印
navigationController - 导航控制器
里面有多少子控制器!
验证: 是否将子控制器添加到"导航控制器"里面。(入栈)
- 点击"下一级控制器"按钮,
- 绿色的控制器
- 点击'返回上一级'按钮,返回到"黄色的控制器"
- 桔色的控制器,
- 点"返回指定控制器"按钮,切换到黄色控制器
- 点"返回根控制器"按钮,切换到红色控制器
-
分析
-
示例代码
-
OneViewController - 红色控制器
-- 下一级控制器 - (IBAction)btnNextClick:(id)sender { TwoViewController *twoVC = [[TwoViewController alloc]init]; [self.navigationController pushViewController:twoVC animated:YES]; } -- 打印控制器的数量 - (IBAction)btnNumClick:(id)sender { NSLog(@"self.childVC= %@",self.navigationController.childViewControllers); }
-
ThreeViewController - 绿色控制器
-- 返回上一级控制器.-'返回黄色控制器' - (IBAction)btnThreeReturnClick:(id)sender { [self.navigationController popViewControllerAnimated:YES]; }
-
FourViewController - 桔色控制器
-- 返回到指定的控制器,'dataVC[1] -- 也就是黄色控制器' - (IBAction)btnReturnToClick:(id)sender { -- 获取导航控制器里,所有的子控制器。 NSArray<UIViewController *>* dataVC = self.navigationController.childViewControllers; [self.navigationController popToViewController:dataVC[1] animated:YES]; -- ❌ 以下是错误示范: 必须是已经在导航控制器里面的子控制器,才能切换. 新创建的控制器,无法切换,因为在导航控制器里面找不到。 OneViewController *oneVC = [[OneViewController alloc]init]; [self.navigationController popToViewController:oneVC animated:YES]; } -- 返回到根目控制器 - (IBAction)btnReturnRootClick:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; }
- 注意:
-
-popToViewController: animated:
返回到指定的子控制器,
此子控制器,必须得要在childViewControllers
中,否则:
NSInternalInconsistencyException
-
-
-
出栈做了哪些操作?
- 销毁"导航控制器"里的子控制器
- 注意:
它是先将要销毁子控制器,集中在一个栈里,
然后再删除。 - 假设当前控制器是"桔色控制器",更加上面"层级所示"那么内部,应该是这样得.
- 此时,点击"返回根控制器",按照一般来讲.销毁顺序:
"桔色控制器 -->绿色控制器 -->黄色控制器", 可实际销毁顺序:
"黄色控制器 -->绿色控制器 -->桔色控制器".这是因为:
- 把子控制器,集中在一个栈里,然后再销毁.