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 条评论
登录 后参与评论

相关文章

来自专栏Java架构师历程

介绍几个移动web app开发框架

jQuery Mobile框架能够帮助你快速开发出支持多种移动设备的Mobile应用用户界面。jQuery Mobile最新版本是1.4.0,默认主题采用扁平化...

1232
来自专栏一“技”之长

iOS开发UINavigation系列四——导航控制器UINavigationController

        在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationCon...

792
来自专栏腾讯大讲堂的专栏

玩转HTML5移动页面(动效篇)

作者:谭照强,热爱折腾前端,喜欢新奇创意的程序员,业余喜欢玩摄影,弄咖啡。 作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上...

2658
来自专栏极乐技术社区

一周小程序【资讯教程Demo】更新

轻松一刻 ? 漫画来自于设计师西乔《神秘的程序员们》 小程序官方更新 小程序升级录音、拍摄、音视频播放等多媒体能力 资讯与教程 微信小程序使用CSS3字体 小程...

2395
来自专栏Sign

creator创建小游戏子域排行榜

cocos官方有对应的子域接入教程: ? https://github.com/cocos-creator/creator-docs/blob/master/z...

7098
来自专栏我杨某人的青春满是悔恨

开源项目——『看知乎』iOS 版

前段时间无意中发现了看知乎,一个知乎答案和用户的精选站。网站开发者是知乎用户苏莉安,他写了个爬虫从知乎抓取数据,而且还提供了 API 文档。我大致看了下文档,感...

1215
来自专栏企鹅号快讯

基于MVP+RxJava2+Retrofit2的资讯类App

本文作者 作者:Horrarndoo 链接: http://www.jianshu.com/p/6ef9e3804395 本文由作者投稿发布。 如果你刚好需要一...

1996
来自专栏IT派

10个免费好用功能强大的网页动画效果库

动效设计是2018年的热门趋势之一。如果你仔细找找的话,会发现许多有趣的用来构建UI动效的工具,而这些素材和工具正在成为越来越多设计项目中不可或缺的催化剂。今天...

1030
来自专栏企鹅号快讯

CPP程序员减少代码BUG的7种方法,拒绝编程5分钟,查代码2小时!

编程5分钟,查代码2小时! 在程序员的编程生涯,免不了和BUG打交道,甚至有些程序员被BUG虐杀的苦不堪言。 ? 当有人指出程序员代码有BUG时,程序员的回答各...

1888
来自专栏州的先生

Python爬虫实战入门三:简单的HTML解析—爬取腾讯新闻

1712

扫码关注云+社区