通常情况下,一个app由多个控制器组成,当app中有多个控制器的时候,我们就需要对这些控制器进行管理。

在开发过程中,当有多个View时,可以用一个大的view去管理多个小的view,控制器也是如此,可以用一个控制器去管理多个控制器。

比如,用一个控制器A去管理3个控制器B、C、D,则控制器A是控制器B、C、D的父控制器,控制器B、C、D是控制器A的子控制器。

iOS中提供了2个比较特殊的控制器,可以用来管理多个子控制器,分别是:

UINavigationController 和 UITabBarController。

一: UINavigationController 的简单介绍

UINavigationController 在app 中很常见,其最典型的应用是系统自带的 "设置",如下图:

点击"通用",跳到General 控制器,点击“键盘”,跳转到“键盘”控制器,点击左上角的按钮,能够返回到上一个控制器。

UINavigationController 是通过栈的形式来管理子控制器。越先进入栈的控制器,越靠后被弹出。

UINavigationController 使用 push 方法将某个控制器压入栈:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

使用pop方法可以移除控制器,回到某一个控制器有三种情况,分别如下:

(1)将栈顶控制器移除

- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

(2)回到指定的子控制器

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;

(3)回到根控制器(栈底控制器)

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

在使用 UINavigationController时,导航栏的内容由栈顶控制器的 navigationItem的属性决定。

UINavigationItem 有以下属性影响着导航栏的内容:

(1)左上角的返回按钮

@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;

(2)中间的标题视图

@property (nonatomic,retain) UIView *titleView;

(3)中间的标题文字

@property (nonatomic,copy) NSString *title;

(4)左上角的视图

@property (nonatomic,retain) UIBarButtonItem *leftBarButtonItem;

(5)右上角的视图

@property (nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

示例程序:

初始化UINavigationController 并将其设置为窗口的 rootViewController。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor]; WMNOneViewController *one = [[WMNOneViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:one];
self.window.rootViewController = nav; [self.window makeKeyAndVisible];
return YES;
}

UINavigationItem的一些属性使用:

- (void)viewDidLoad {
[super viewDidLoad];
self.view.frame = [[UIScreen mainScreen] bounds];
//设置title
self.navigationItem.title = @"第一个控制器";
//设置下一个控制器的返回按钮
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
//设置当前(栈顶)控制器的左上角视图
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
} - (void)viewDidLoad {
[super viewDidLoad];
self.view.frame = [[UIScreen mainScreen] bounds];
//设置中间的标题视图
self.navigationItem.titleView = [UIButton buttonWithType:UIButtonTypeContactAdd];
//设置当前控制器右上角的视图
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:nil action:nil];
} - (void)viewDidLoad {
[super viewDidLoad];
self.view.frame = [[UIScreen mainScreen] bounds];
UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:nil action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];
//设置当前(栈顶)控制器的右上角视图
self.navigationItem.rightBarButtonItems = @[item1,item2];
}

跳转到下一个控制器,示例程序如下:

- (IBAction)jumpTwo {
//跳转到下一个控制器
WMNTwoViewController *two = [[WMNTwoViewController alloc] init];
[self.navigationController pushViewController:two animated:YES];
}

返回到上一个控制器或者某一个控制器:

- (IBAction)backToOne {
//回到根控制器
//[self.navigationController popToRootViewControllerAnimated:YES];
//跳转到第一个控制器,之前的控制器全部pop
[self.navigationController popToViewController:self.navigationController.viewControllers.firstObject animated:YES];
} - (IBAction)backToTwo {
//移除栈顶控制器即可
[self.navigationController popViewControllerAnimated:YES];
}

二: UITabBarController 的简单介绍

和UINavigationController类似,UITabBarController 也可以轻松管理多个子控制器,轻松完成多个控制器之间的切换,典型的例子就是微信、QQ、微博等应用。

UITabBarController添加控制器的方式有两种,分别是:

(1):添加单个子控制器

- (void)addChildViewController:(UIViewController *)childController;

(2):设置子控制器数组

@property (nonatomic,copy) NSArray *viewControllers;

在UITabBarController 中,如果其有N个控制器,则UITabBar内就会有N个UITabBarButton 作为子控件。如果UITab有4个子控制器,那么UITabBar的结构大致如下图所示:

UITabBarButton里面显示什么内容,是由对应子控制器的tabBarItem属性决定。如下图:

UITabBarController 的一个示例程序:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds] ];
self.window.backgroundColor = [UIColor whiteColor];
//1.创建 tabbar控制器
UITabBarController *tabbarVC = [[UITabBarController alloc] init];
self.window.rootViewController = tabbarVC; //2.添加子控制器
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor grayColor];
vc1.tabBarItem.title = @"联系人";
vc1.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"]; UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor lightGrayColor];
vc2.tabBarItem.title = @"动态";
vc2.tabBarItem.image = [UIImage imageNamed:@"tab_qworld_nor"];
vc2.tabBarItem.badgeValue = @""; UIViewController *vc3 = [[UIViewController alloc] init];
vc3.view.backgroundColor = [UIColor lightTextColor];
vc3.tabBarItem.title = @"设置";
vc3.tabBarItem.image = [UIImage imageNamed:@"tab_me_nor"]; tabbarVC.viewControllers = @[vc1,vc2,vc3];
[self.window makeKeyAndVisible]; return YES;
}

效果图如下:

三:小结

在主流的App中,通常是将 UINavigationController 和 UITabBarController 结合使用。通常情况下,将UITabBarController做为根控制器,UITabBarController的子控制器是 UINavigationController,然后UINavigationController的子控制器又是一个个UIViewController。其结构示意图如下:

iOS中多控制器的使用的更多相关文章

  1. iOS中UINavigationController控制器使用详解

    一.概述 UINavigationController用来管理视图控制器,在多视图控制器中常用.它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹 ...

  2. IOS中导航控制器的代理及隐藏控制器刚出现时的滚动条

    一.导航控制器的代理 1.UINavigationController的delegate属性 2.代理方法 1> 即将显示新控制器时调用 /* navigationController : 导航 ...

  3. iOS中分段控制器与UIScrollView结合使用

    指定根视图: // 设置window的根视图控制器 self.window.rootViewController = [[UINavigationController alloc] initWithR ...

  4. iOS:iOS中的多控制器管理

    iOS中的控制器有三种创建方式: 1.通过storyboard创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@" ...

  5. IOS中的UINavigationController(导航控制器)

    UINavigationController UINavigationControlle:导航控制器,是iOS中最常用的多视图控制器之一,它用来管理多个试图控制器 导航控制器可以认为是管理控制器的控制 ...

  6. Swift - iOS中各种视图控制器(View Controller)的介绍

    在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来 ...

  7. NSTimer 销毁问题 和 iOS中控制器的释放问题

    俗话说的好,前人栽树后人乘凉,最近看了很多博文,不少博文提到了NSTimer的销毁问题, 之前我都没怎么注意,现在对照着文章一一实践发现坑还真不少.下面是我读到的几篇博文分享给大家 @啸笑天的NSTi ...

  8. iOS中控制器的释放问题

    iOS中控制器的释放问题 ARC工程是可以重写dealloc方法并被系统调用的,但不需要手动调用父类的dealloc,手写[super dealloc]方法会报错,事实上系统会自动帮你调用父类的dea ...

  9. iOS开发中视图控制器ViewControllers之间的数据传递

    iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...

随机推荐

  1. 解析CSS加密技术之“障眼法”

    CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观.通过使用CSS样式设置页面的格式,可将页面的内容与表现形式分离. ...

  2. shell 中grep命令详解

    用‘grep’搜索文本文件如果您要在几个文本文件中查找一字符串,可以使用‘grep’命令.‘grep’在文本中搜索指定的字符串.举个例子:假设您正在‘/usr/src/linux/Documentat ...

  3. <一>SQL优化1-4

    第一条:去除在谓词列上编写的任何标量函数        --->在select 显示列上使用标量函数是可以的.但在where语句后的过滤条件部分对列使用函数,需要考虑.因为执行sql的引擎会因为 ...

  4. 一天一个Java基础——反射

    1.概念 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力 Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接 反射允许在编写与执行 ...

  5. 【大数比较】NYOJ-73

    比大小 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-1234 ...

  6. 一、oracle 高水位线详解

    一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称 ...

  7. java transient简介

    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable ...

  8. Iwpriv工作流程及常用命令使用之二

    iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...

  9. POJ 1094 Sorting It All Out

    题意:给出m对关于n个字母的小于关系,输出通过这些关系能得到的结论,如果可以排序就输出至少知道第几个关系时就可以知道顺序,从小到大输出顺序:如果产生歧义就输出在第几个关系时出现歧义,如果不能得出准确的 ...

  10. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...