UINavigationController

UINavigationController

A container view controller that defines a stack-based scheme for navigating hierarchical content.

一个定义基于堆栈结构的导航分层内容的容器视图控制器。

声明

@interface UINavigationController : UIViewController

概述

导航控制器是一个容器视图控制器,在导航界面管理一个或多个子视图控制器,一次只能显示一个视图控制器。在视图控制器中选择一个项目会使用动画在屏幕上推送一个新的视图控制器,从而隐藏先前的视图控制器。在界面顶部的导航栏中点按后退按钮可删除顶视图控制器,从而在下方显示视图控制器。

导航控制器对象使用有序数组(称为导航堆栈)管理其子视图控制器。数组中的第一个视图控制器是根视图控制器,它在堆栈的底部。数组中的最后一个视图控制器是堆栈中最顶层的项,代表当前正在显示的视图控制器。您可以使用segues或此类的方法从堆栈中添加和删除视图控制器。用户还可以使用导航栏中的“后退”按钮或使用左边缘轻扫手势来删除最上方的视图控制器。

导航控制器在界面顶部管理导航栏,在界面底部管理可选的工具栏。导航栏始终存在,并由导航控制器本身进行管理,导航控制器使用子视图控制器提供的内容更新导航栏。

导航控制器与其delegate对象协调行为。delegate对象可以覆盖视图控制器的推入或弹出操作,提供自定义动画过渡,并指定导航界面的首选方向。您提供的delegate对象必须符合UINavigationControllerDelegate协议。

更新导航条

每次顶级视图控制器更改时,导航控制器都会相应地更新导航栏。 具体地说,导航控制器更新显示在三个导航栏位置(左,中和右)中每个位置上的栏按钮项。 条形按钮项目是UIBarButtonItem类的实例。

导航栏的着色由导航栏本身的属性控制。 使用tintColor属性可更改栏中项目的颜色,并使用barTintColor属性来更改栏本身的颜色。 导航栏不会从当前显示的视图控制器继承其色调颜色。

有关导航栏的更多信息,请参见UINavigationBar。 有关如何创建条形按钮项目的更多信息,请参见UIBarButtonItem。

左项

导航栏左侧的项目可提供导航回到上一个视图控制器。最左侧按钮的内容确定如下:

  • 如果新的顶级视图控制器具有自定义的左键按钮项,则会显示该项。要指定自定义左栏按钮项,请设置视图控制器导航项的leftBarButtonItem属性。
  • 如果顶级视图控制器没有自定义的左按钮按钮项目,但是前一个视图控制器的导航项目在其backBarButtonItem属性中具有一个对象,则导航栏将显示该项目。
  • 如果两个视图控制器中的任何一个都未指定自定义条形按钮项,则使用默认的后退按钮,其标题设置为上一个视图控制器的title属性的值,即,视图控制器向下一级堆栈。

注意

如果后退按钮的标题太长而无法容纳在可用空间中,则导航栏可能会用字符串“后退”代替实际的按钮标题。仅当上一个视图控制器提供了后退按钮时,导航栏才会执行此操作。如果新的顶级视图控制器具有自定义的左栏按钮项(其导航项目的leftBarButtonItem或leftBarButtonItems属性中的对象),则导航栏不会更改按钮标题。

中间项

导航控制器更新导航栏的中间部分,如下所示:

  • 如果新的顶级视图控制器具有自定义标题视图,则导航栏将显示该视图以代替默认标题视图。要指定自定义标题视图,请设置视图控制器的导航项的titleView属性。
  • 如果未设置自定义标题视图,则导航栏会显示一个标签,其中包含视图控制器的默认标题。此标签的字符串通常是从视图控制器本身的title属性获得的。如果要显示与视图控制器关联的标题不同的标题,请改为设置视图控制器导航项的title属性。

右项

导航控制器按如下所示更新导航栏的右侧:

  • 如果新的顶级视图控制器具有自定义的右栏按钮项,则会显示该项。要指定自定义右键栏按钮项,请设置视图控制器的导航项的rightBarButtonItem属性。

  • 如果未指定自定义右栏按钮项,则导航栏在其右侧不显示任何内容。

例子

// AppDelegate.m
// 导航控制器根视图实例
ViewController *viewController = [[ViewController alloc] init];

// 导航控制器实例
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:view];
    
// 设置导航控制器为根视图
self.window.rootViewController = navigationController;

// ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor systemPurpleColor];
    view.frame = CGRectMake(100, 100, 100, 100);
    [self.view addSubview:view];
    // 为view添加手势
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pushViewController)];
    [view addGestureRecognizer:tapGesture];
}

// push相应方法
- (void)pushViewController{
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.backgroundColor = [UIColor whiteColor];
    // 设置navigationItem
    viewController.navigationItem.title = @"内容";
    viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"右侧标题" style:UIBarButtonItemStylePlain target:self action:nil];
    [self.navigationController pushViewController:viewController animated:YES];
}

总结

iOS基本页面框架中主要元素UINavigationController和UITabBarController,都是满足MVC设计模式。

MVC
UINavigationItemUINavigationBarUINavigationController
UITabBarItemUITabBarUITabBarController

Controller处理逻辑上的业务功能

UITabBarController处理可供选择的底部标签选项卡视图控制器切换功能,UINavigationController处理基于堆栈结构的push、pop的视图控制器切换功能。

View提供用户交互的界面

UINavigationBar顶部的导航条,UITabBar底部的选项卡条。

Model提供用于展示的数据

提供页面的按钮,标题等信息数据,通过Controller传递给View以展示。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值