专栏首页非典型技术宅iOS多控制器之UINavigationController&UITableBarController1. 多控制器2. UINavigationController3. UITableBarCont

iOS多控制器之UINavigationController&UITableBarController1. 多控制器2. UINavigationController3. UITableBarCont

1. 多控制器

  • 一个iOS的app很少只由一个控制器组成,除非这个app极其简单
  • 当app中有多个控制器的时候,我们就需要对这些控制器进行管理
  • 有多个view时,可以用一个大的view去管理1个或者多个小view
  • 控制器也是如此,用1个控制器去管理其他多个控制器

比如,用一个控制器A去管理3个控制器B、C、D 控制器A被称为控制器B、C、D的“父控制器” 控制器B、C、D的被称为控制器A的“子控制器”

  • 为了便于管理控制器,iOS提供了2个比较特殊的控制器:
    • UINavigationController
    • UITabBarController

2. UINavigationController

2.1 UINavigationController的使用步骤

  • 初始化UINavigationController
  • 初始化UINavigationController时, 可以通过initWithRootViewController:方法传入一个控制器作为根控制器
  • 这个根控制器永远处于栈底(如果栈中只有一个对象,那么根控制器也处于栈顶)
  • 设置UIWindow的rootViewController为UINavigationController
  • 根据具体情况,通过push方法添加对应个数的子控制器

2.2 代码创建

  • 初始化UINavigationController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建窗口,根据屏幕大小设置
    _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//    设置window背景颜色
    _window.backgroundColor = [UIColor lightGrayColor];
    
//    创建控制器
    UIViewController *mainController = [[UIViewController alloc] init];
    
//    创建导航控制器,同时给它指定一个根控制器
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:mainController];
    
//    给窗口指定根视图控制器
    _window.rootViewController = nav;
    
//    让当前窗口成为主窗口并显示
    [_window makeKeyAndVisible];

    return YES;
}

2.3 给nav添加子控制器的三种方法

1,initWithRootViewController:创建导航控制器时,直接指定一个根控制器。第一次显示出来的自控制器; 2,addChildViewController:此方法是UIViewController的方法,可以用来添加子控制器; 3,通过属性viewControllers进行设置。此属性是UINavigationController的,它可以一次添加多个自控制器; 4,最正常的用法: pushViewController,入栈的方式添加自控制器。

//    使用addChildViewController添加
    [nav addChildViewController:mainController];
    
//    通过属性viewControllers进行设置
    nav.viewControllers = @[mainController];
    
//    通过pushViewController入栈的方式添加自控制器
    [nav pushViewController:mainController animated:YES];

2.4 UINavigationController的子控制器

2.4.1 UINavigationController以栈的形式保存子控制器

@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;

2.4.2 入栈

  • 使用push方法能将某个控制器压入栈
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

2.4.3 出栈

  • 返回到上一个控制器(将栈顶的控制器移除)
-(UIViewController *)popViewControllerAnimated:(BOOL)animated;
  • 返回到指定的控制器

Paste_Image.png

  • 返回根控制器(栈底控制器)

Paste_Image.png

2.5 修改导航栏的内容

  • 导航栏的内容由栈顶控制器的navigationItem属性决定
  • UINavigationItem有以下属性影响着导航栏的内容
    //左上角的返回按钮
    @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
    
    //中间的标题视图
    @property(nonatomic,retain) UIView *titleView;
    
    //   中间的标题文字
    @property(nonatomic,copy)   NSString *title;
    
    //   左上角的视图
    @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
    
    //   右上角的视图
    @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

2.6 UINavigationController常见问题

  • 导航条高度:44
  • UINavigationController保存子控制起的形式:栈
  • 获取UINavigationController下面的所有的子控制器:viewControllers / childViewControllers
  • 导航条中按钮使用原始图片不进行系统渲染:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
  • navigationController 和navigationItem都是通过"控制器"对象调用的
  • navigationBar 是通过"导航控制器"对象调用的
  • 如果想改变导航条整体的样式 那么应该找 navigationbBar
  • 如果想改变导航条上内容找 navigationItem

3. UITableBarController

  • UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换。
  • UITabBarController的创建过程可以参考UINavigationController

Paste_Image.png

3.1. UITableBarController的界面说明

  • 下方的工具条称为UITabBar ,如果UITabBarController有N个子控制器,那么UITabBar内部就会有N 个UITabBarButton作为子控件与之对应。
  • UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度为49
  • UITabBar的结构⼤大致如下图所示:

Paste_Image.png

7.2.2 UItabBarItem的重要属性

Paste_Image.png

7.2.3 往UITabBarController中添加子控制器

有两种方法UITabBarController中添加子控制器 :

  • [tb addChildViewController:c1];
  • tb.viewControllers=@[c1,c2,c3,c4];

注意:展示的顺序和添加的顺序一致,和导航控制器中不同,展现在眼前的是导航控制器的根视图控制器也就是第一个添加到导航控制器上的视图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ViewController及View的生命周期1. 起因2. Controller的生命周期3. View的生命周期4. 内存警告

    stanbai
  • iOS四大对象之UIWindow及四大对象之间的关系1. UIWindow/使用纯代码加载根控制器2. UIWindow的创建过程3. 四大对象之间的关系

    stanbai
  • Swift实践:使用CoreData完成上班签到小工具1. CoreData Stack的作用2.创建 CoreData Stack3. 一对多的关系4. 完成Demo,了解使用CoreData St

    stanbai
  • 如何提高SDN可拓展性

    Software Defined Networking是一种控制平面和数据平面分离的可编程的网络架构,目前已经有许多商业落地案例。在部署SDN时,往往会因SDN...

    SDNLAB
  • VR开发--SteamVR框架工具(1):VRTK

    1、GitHub远程仓库: git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit 2...

    雷潮
  • kubernetes从懵圈到熟练 – 理解集群控制器

    当我们尝试去理解K8S集群工作原理的时候,控制器肯定是一个难点。这是因为控制器有很多,具体实现大相径庭;且控制器的实现用到了一些较为晦涩的机制,不易理解。但是,...

    kubernetes中文社区
  • JMeter逻辑控制器08

    前言 在jmeter中逻辑控制器主要分类两类: 控制jmeter测试计划中节点的逻辑执行顺序等等 对jmeter的节点进行分组,方便结果统计等等 进一步简化下,...

    苦叶子
  • 浅析 Kubernetes 控制器的工作原理

    Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 的大脑。例如,ReplicaSet 控制器负责...

    米开朗基杨
  • iOS基础问答面试题连载(二)-附答案

    2016-11-2120:41:52 发表评论 7℃热度 1.xcode5和xcode7区别? 2.pch文件原理? 3.UIApplication常见...

    timhbw
  • 【云原生架构】节俭K8s Operator 第2部分:将控制器缩放到零

    在本系列博客的第1部分中,我们介绍了这样一种想法,即Kubernetes运营商(在大规模部署时)可以消耗大量资源,无论是实际资源消耗还是可调度容量的消耗。我们还...

    首席架构师智库

扫码关注云+社区

领取腾讯云代金券