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

相关文章

来自专栏Objective-C

Swift-MVVM 简单演练(三)

2813
来自专栏hotqin888的专栏

golang-fullcalendar,engineercms完善日历事件-支持拖曳drop,改变时间resize

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1592
来自专栏葡萄城控件技术团队

VS2010 Extension实践(1)

最近VS2010 Extension在Visual Studio Blog(http://blogs.msdn.com/visualstudio/)上提得很频繁...

2009
来自专栏mukekeheart的iOS之旅

iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决

  最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的ce...

5968
来自专栏xx_Cc的学习总结专栏

iOS-手势UIGestureRecognier详解一. 手势UIGestureRecognier简介二. 手势的抽象类——UIGestureRecognizer三. UIGestureRecogni

2075
来自专栏Scott_Mr 个人专栏

自定义转场详解(一)

1362
来自专栏一“技”之长

iOS文本布局探讨之三——使用TextKit框架进行富文本布局

        关于图文混排,其实以前的博客已经讨论很多,在实际开发中,经常使用第三方的框架来完成排版的需求,其中RCLabel和RTLabel是两个比较好用的...

1002
来自专栏CRPER折腾记

React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)

上个版本 :React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏

3322
来自专栏移动端开发

iOS 转场动画探究(一)

什么是转场动画:        转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和...

6675
来自专栏非著名程序员

基础篇章:关于 React Native 之 Navigator 组件的讲解

(友情提示:RN学习,从最基础的开始,大家不要嫌弃太基础,会的同学请自行略过,希望不要耽误已经会的同学的宝贵时间) 今天我们来讲讲Navigator这个小家伙,...

1857

扫码关注云+社区