多控制器
控制器
A
管理3个控制器B、C、D
控制器A
为父控制器
控制器B、C、D
为子控制器
UINavigationController
- 初始化
UINavigationController
- 设置
UIWindow
的rootViewController
为UINavigationController
- 将第一个视图控制器设置为
UINavigationController
的根视图控制器 - 通过
push
方法新建子控制器 - 通过
pop
方法可以返回到上一个控制器
UIWindowScene *windowScene = (UIWindowScene*)scene;
self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
self.window.frame = windowScene.coordinateSpace.bounds;
UINavigationController *nav = [[UINavigationController alloc]init];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
//push方法
RedViewController *redVC = [[RedViewController alloc]init];
[nav pushViewController:redVC animated:YES];
基本使用(跳转)
设置UINavigationController
的RootViewController
为redVC
UIWindowScene *windowScene = (UIWindowScene*)scene;
self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
self.window.frame = windowScene.coordinateSpace.bounds;
RedViewController *redVC = [RedViewController new];
//设置其RootViewController
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:redVC];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
redVC
的控制器加跳转
- (IBAction)Touch:(id)sender {
BlueViewController *blueVC = [[BlueViewController alloc]init];
[self.navigationController pushViewController:blueVC animated:YES];
}
注意事项
- 创建控制器的同时指定其根控制器
- 获取导航控制器
self.navigationController
,能获取到最近的导航控制器 pop
能返回上一级,或者指定的控制器(必须存在在栈内的),或者根控制器UINavigationController
有导航控制器栈
//返回到栈内指定的控制器
NSArray *array = UINavigationController.viewControllers;
UIViewController *vc = array[1];
[self.navigationController popToViewController:vc animated:YES];
代码设置导航栏的title
- 设置
title
为文字
self.navigationItem.title = @"test";
- 设置
title
为按钮
UIButton *addBtn = [UIButton buttonWithType:UIButtonTypeContactAdd];
self.navigationItem.titleView = addBtn;
代码设置导航栏的按钮
- 设置左侧按钮(类型必须为
UIBarButtonItem
) - 右侧同理
//action可以添加点击事件
UIBarButtonItem *addBtn = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:nil];
self.navigationItem.leftBarButtonItem = addBtn;
- 设置多个按钮
self.navigationItem.leftBarButtonItems = @[addBtn2,addBtn1];
- 设置返回按钮(设置的是下一页的返回按钮)
self.navigationItem.backBarButtonItem.title = @"测试";
- 当控制器不是根控制器,左侧放置按钮就替代返回按钮了,需要自己设置返回功能
导航栏设置图片
UIImage *image = [UIImage imageNamed:@"imagename"];
//需要设置渲染模式,默认无论什么图片都是蓝色
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem *item = [[UIBarButtonItem alloc]image target:self action:nil];
设置导航栏样式
//设置导航栏背景图片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
//设置文字为白色
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
//设置渲染的颜色
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];
建议storyboard使用导航控制器
较为简单,不展示了
- 点击
ViewControler
->editor
->embed in
->UINavigationController
可以将ViewControler
嵌套一个UINavigationController
- 页面的
BackButton
修改的是下一页的返回按钮
Segue传值
UIStoryboardSegue
是Storyboard
拖线产生的连接线UIStoryboardSegue
的属性
Identifier
:标记
source
:源控制器
destination
:目标控制器
//实现跳转时会调用,只要是storyboard的线
//代理方法
//Segue的准备工作
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
**可以根据segue的Identifier属性做判断**
**或者根据class来判断**
//获取目标控制器
UIViewController *VC = segue.destinationViewController;
//可以设置其title
VC.navigationItem.title = @"随便改";
}
- 手动型
Segue
:controller
连线到controller
,需要设置Identifier
//调用该方法才跳转,同时调用prepareForSegue方法
[self performSegueWithIdentifier:@"标识" sender:nil];
- 自动型
Segue
:按钮连线到controller
,无需验证
注意事项
跟换启动的storyboard
文件需要修改改info
文件的该属性