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];
}

效果:

iOS13 UIActivityViewController head区域 ios navigationcontroller_swift

可以看到上ViewController代码self.navigationItem进行配置标题、self.navigationController配置颜色风格等。

self.navigationController 是什么?

每个视图控制器UIViewController都具有navigationController属性,这个属性指向是当前视图的导航控制器对象,也是当前导航控制器下视图都是指向它,其中一个UIViewController修改了NaviagtionConrtoller的属性其他视图层的导航控制器也会发生变化的。

iOS13 UIActivityViewController head区域 ios navigationcontroller_swift_02

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隐藏工具栏