IOS 导航控制器分为多层级导航控制器
naviagtionController
和平行分栏控制器UITabBar
(底部切换栏)。IOS导航控制器是什么呢?其实就是我们web的路由切换功能,只不过在app开发切换是ViewController
。
什么是导航控制器 NavigationController ?
NavigationController 是继承ViewController实现的,我们可以理解为一个具有切换视图并保存视图栈记录的一个视图控制器,在开发中我们应该如何使用呢?那么NavigationController 是一个ViewController 说明我们可以把APP根视图替换成NavigationController进行路由。下面我们进行简单代码示例:
1. 首先修改SceneDeletgate自定义UIWindow和跟视图实现导航控制器
自定义UIWindow我们需要对info.plist修改一下配置,具体参考之前写的 Xcode11 后Appdelegate自定义UIWindow对象
// SceneDeletegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene* )scene];self.window.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);// 初始化第一级视图UIViewController* ROOTVC = [[ViewController alloc] init];// 初始化层级导航控制器UINavigationController* ROOTNavigation = [[UINavigationController alloc]initWithRootViewController:ROOTVC];self.window.rootViewController = ROOTNavigation;// 显示[self.window makeKeyAndVisible];
}
修改一下第一级视图的代码
ViewController.m
- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏的颜色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 设置导航栏文字颜色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本视图的导航标题self.navigationItem.title = @"首页";self.view.backgroundColor = [UIColor grayColor];
}
效果:
可以看到上
ViewController
代码self.navigationItem
进行配置标题、self.navigationController
配置颜色风格等。
self.navigationController 是什么?
每个视图控制器UIViewController
都具有navigationController
属性,这个属性指向是当前视图的导航控制器对象,也是当前导航控制器下视图都是指向它,其中一个UIViewController
修改了NaviagtionConrtoller
的属性其他视图层的导航控制器也会发生变化的。
self.navigationItem 是什么?
navigationItem属性其实是每个视图的导航栏配置项,可以单独配置当前的视图的导航的标题、左右两边按钮、颜色、风格等,只在当前视图层激活时候才生效。
如何切换视图 pushViewController
我们可以通过调用NavigationController
的方法进行视图切换,下面简单演示一下视图切换功能。
// ViewController.m
- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏的颜色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 设置导航栏文字颜色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本视图的导航标题self.navigationItem.title = @"首页";self.view.backgroundColor = [UIColor grayColor];UIButton* _btn = [MyUI createButton:@"跳转"];_btn.frame = CGMakeRect(100, 100, 40, 100);[_btn addTarget:self action:@selector(go:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_btn];}- (void) go {UIViewController* view = [[UIViewController alloc] init][self.navigationController pushViewController:view animated:YES];
}
通过点击我们看到路由发生了切换和后退等功能。
UINavigationController 属性
名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
topViewController | UIViewController | 栈堆中的顶层视图控制器 | |
visibleViewController | UIViewController | 返回当前激活(即显示)的视图控制器,如果不存在激活的视图,则返回栈堆中顶层的视图控制器 | |
viewControllers | NSArray<__kindof UIViewController *> | 当前导航控制器的视图栈堆 | [] |
navigationBarHidden | BOOL | 隐藏导航栏 | NO |
navigationBar | UINavigationBar | 导航控制器的导航栏对象 | UINavigationBar |
toolbarHidden | BOOL | 隐藏工具栏 | YES |
toolbar | UIToolbar | 导航控制器工具栏对象 | UIToolbar |
UINavigationController 方法
-
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
是否开启动画切换视图,并且压入导航栈堆。 -
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
从栈堆弹出当前视图。并且返回剩余的视图栈堆 -
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
弹出视图栈堆,直到指定的视图控制器前面 -
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated
直接恢复到顶级视图层。 -
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated API_AVAILABLE(ios(3.0))
直接设置新的视图栈堆,会跟当前顶级视图状态和新的视图栈堆来执行后退还是前进。 -
- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated
隐藏导航栏 -
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated
隐藏工具栏
…后续补充更多内容