入栈操作
-
- pushViewController: animated:
- 给导航控制器,添加子控制器
UINavigationController *navC = [[UINavigationController alloc]init]; navC.view.backgroundColor = [UIColor redColor]; UIViewController* vc = [[UIViewController alloc]init]; vc.view.backgroundColor = [UIColor yellowColor]; [navC pushViewController:vc animated:YES];
- 也可以这样, 创建的时候,就直接添加一个控制器
- initWithRootViewController:
内部同样是调用- pushViewController: animated:
方法UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:vc];
- 验证:
- 在已经使用
- initWithRootViewController: vc
的情况下,再次[navC pushViewController:vc animated:YES];
- 会报错:
Pushing the same view controller instance more than once is not supported(<UIViewController: 0xxxx>)' same - 相同得 不支持多次推送同一个视图控制器实例`UIViewController`
- 在已经使用
- 给导航控制器,添加子控制器
- 将自定义控制器,添加导航控制器里,并实现控制器之间切换。
- 将自定义控制器
OneViewController
添加到UINavigationController
里OneViewController * oneVC = [[OneViewController alloc]init]; UINavigationController *navC = [[UINavigationController alloc]init]; [navC pushViewController:oneVC animated:YES];
- 点击下一个控制,实现控制器之间的切换
-- 在'第一个控制'的按钮点击事件里面, -- 创建第2个控制器,且添加到"导航控制器",成为子控制器。 TwoViewController *twoVC = [[TwoViewController alloc]init]; [self.navigationController pushViewController:twoVC animated:YES];
- 为什么在自定义控制器里,可以直接
.
出navigationController
?UINavigationController 继承 UIViewController
-
UINavigationControllerItem
- 是
UIViewController
的分类 - 里面有个
navigationController 属性
-
navigationController
就是当前的导航控制器
- 是
- 自定义控制器继承自
UIViewController
,所以可以直接.
出navigationController
- 为什么在自定义控制器里,可以直接
- 将自定义控制器
-
导航控制器的入栈操作分析
window的根控制器 强引用 导航控制器
- 开始的时候
自定义控制器oneVC
将view
放入栈顶控制器View
里,导航控制器栈添加oneVC
. - 当
自定义控制器twoVC
要入栈时,栈顶控制器View
会将oneVC.view
移除,加入twoVC.view
."导航控制器栈"加入twoVC
。
注意:oneVC.view
并没有销毁,因被oneVC强引用
,而oneVC
还在"导航控制器栈"最底部. - 当
自定义控制器threeVC
入栈时,栈顶控制器View
移除twoVC.view
,加入threeVC.view
."导航控制器栈"加入threeVC
。