免费开源的iOS开发学习平台

UINavigationController介绍:1-导航控制器简介

导航控制器(UINavigationController)是iOS开发中最常用的容器型控制器之一,其本身的样式可供定制的内容并不很多,但其主要作用在于容纳其他类型的控制器,并且实现不同控制器之间的跳转。学习导航控制器,最核心的知识在于掌握如何通过导航控制器实现控制器的跳转,以及如何定制导航栏样式。

控制器类型简介

iOS开发中,苹果把控制器分成了两大类:

  • 内容类控制器(Content ViewController):所谓内容类控制器,主要用于显示内容,常见的有UIViewController,UITableViewController,UICollectionViewController等;

  • 容器类控制器(Container ViewController):所谓容器型控制器,主要用于容纳其他内容类控制器,本身并不主要用于显示有用的内容,主要工作负责在不同控制器之间进行切换,常见的有UINavigationController,UITabBarController等。

UINavigationController简介

导航控制器在实际的App中十分常见,iPhone的设置功能中就使用到了导航控制器,如下图所示。通过导航控制器,可以实现控制器之间的跳转与返回。导航控制器在UIKit框架中对应UINavigationController类,该类的定义中提供了管理相关子控制器的方法以及导航控制器样式定制的API。

堆和栈的简介

学习导航控制器对子控制器的管理机制,首先需要了解栈(Stack)的概念,导航控制器对于控制器的管理方式采用的就是栈的模式,遵守先进后出的原则。

创建导航控制器

导航控制器的创建既可以使用代码创建,也可以使用Xib或Storyboard创建。不论使用StoryBoard,还是代码创建导航控制器,核心有三个步骤:

  • 实例化一个控制器对象,例如一个UIViewController类的对象,作为导航控制器对象的根控制器rootViewcontroller

  • 实例化UINavigationController对象,并指定该导航控制器对象的根控制器rootViewcontroller

- (instancetype)initWithRootViewController:(UIViewController *)rootViewController;
  • 定制导航栏的显示样式。例如,我们可以设置导航栏的标题,需要注意的是该属性是在UINavigationController的父类UIViewController类中定义的。
@property(nullable, nonatomic,copy) NSString *title;

示例代码

下方的示例代码中,创建了一个最简单的导航控制器对象,并且为其设置了一个标题。

  • 新建一个Single View Application应用

  • 在AppDelegate.m文件中,添加如下代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  
    UIViewController *navRootVC = [[UIViewController alloc] init];
    navRootVC.view.backgroundColor = [UIColor redColor];
    UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:navRootVC];
    navRootVC.title = @"99iOS.com";
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController = navVC;
    [self.window makeKeyAndVisible];
    
    return YES;
}

在上述代码中,有如下几个注意点:

  • 需要区分UIWindow的rootViewController与UINavigationController的rootViewController

  • 在定制导航栏中间文字的时候,设置的是navRootVC(UIViewController类)的title属性,而不是navVC(UINavigationController类)的title属性,有关导航控制器样式的设置后面会详细介绍。

运行效果:

示例代码

https://github.com/99ios/9.2.1