导航控制器及TabBar控制器

多控制器App概述

  • 一个 iOS 的 App 很少由一个控制器组成,除非这个 App 极其简单
  • App 中有多个控制器的时候,我们就需要对这些控制器进行管理
  • 在之前的学习中,有多个 View 时

    • 可以用一个大的 View 去管理 1 个或者多个小 View
  • 控制器也是如此,用 1 个控制器去管理其他多个控制器

  • 举例:用一个控制器 A 去管理 3 个控制器 BCD

    • 控制器 A 被称为控制器 BCD 父控制器
    • 控制器 BCD 被称为控制器 A 子控制器
  • 为了便于管理控制器,iOS 提供了 2 个比较特殊的控制器

    • UINavigationController 导航控制器
    • UITabBarController TabBar(标签)控制器
  • 掌握导航控制器(UINavigationController)核心概念 ——
  • 掌握标签控制器(UITabBarController)核心概念 —— 平级
  • 掌握经典应用程序架构图
  • 掌握 Modal(模态) 展现控制器的时机
  • 掌握 Modal 的数据传值方式
    • 顺序传值 —— 通过属性
    • 逆向传值 —— 通过代理

导航控制器 UINavigationController

UINavigationController 结构示意图


掌握的概念

  • 的方式管理子视图控制器

    • 入栈/压栈 addObject:
    • 出栈 removeLastObject
  • UINavigationController —— 导航控制器

    • view —— 导航控制器的容器视图
  • UINavigationBar —— 导航条

  • UINavigationItem —— 导航条目

掌握的方法

  • pushViewController:animated: 压栈,显示新的控制器
  • popViewControllerAnimated: 出栈,返回上一级控制器,如果到栈顶什么也不做

Storyboard 演练

  • ViewController 中重写 viewDidAppear: 方法,并且实现以下代码
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"%@", self.navigationItem.title);
    NSLog(@"%@", self.navigationController.viewControllers);
}

有关 viewDidAppear: 等相关视图生命周期的方法,在后续介绍 视图生命周期 再讲

此方法会在每次视图控制器的根视图出现在屏幕上时调用

注意:返回按钮需要在前一个控制器中设置

纯代码演练

  • AppDelegate 实现以下代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    ViewController *vc = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];

    self.window.rootViewController = nav;

    [self.window makeKeyAndVisible];

    return YES;
}
  • ViewController 实现以下代码
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupUI];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"%@ %zd", self.navigationController.viewControllers, self.navigationController.viewControllers.count);
}

#pragma mark - 监听方法
/// 返回上一个控制器
- (void)backToPrevious {
    // 如果已经是栈顶控制器,不会有任何反应
    [self.navigationController popViewControllerAnimated:YES];
}

/// 显示下一个控制器
- (void)showNext {
    [self.navigationController pushViewController:[[ViewController alloc] init] animated:YES];
}

#pragma mark - 设置界面
- (void)setupUI {
    // 0. 设置背景颜色
    self.view.backgroundColor = [UIColor whiteColor];

    // 1. 设置标题
    NSString *title = [NSString stringWithFormat:@"第 %zd 个", self.navigationController.viewControllers.count];
    NSString *nextTitle = [NSString stringWithFormat:@"第 %zd 个", self.navigationController.viewControllers.count + 1];

    self.title = title;

    // 2. 设置右侧按钮
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:nextTitle style:UIBarButtonItemStylePlain target:self action:@selector(showNext)];

    // 3. 添加 pop 按钮
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
    btn.center = self.view.center;
    [self.view addSubview:btn];

    [btn addTarget:self action:@selector(backToPrevious) forControlEvents:UIControlEventTouchUpInside];
}

@end

TabBar 控制器

UITabBarController 结构示意图


概念

  • 平级的方式管理子视图控制器

    • 子控制器一次性创建
    • 子控制器不会被销毁
  • UITabBarController —— 标签控制器

    • view —— TabBar 控制器的容器视图
  • UITabBar —— 标签条

  • UITabBarItem —— 标签条目

  • 设置子控制器数组

@property(nullable, nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值