导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用
很多时候,在UI设计方面同时需要使用导航控制器和标签栏控制器,这时,需要掌握如何设计结合使用这两种不同控制器。比如手机QQ,程序有三个标签 栏(分别为消息、联系人、动态),同时在选择某个联系人或者会话时,会进入聊天的子页面,因此这里同时使用到了标签栏控制器和导航控制器。
我目前所知道有以下方法可实现上述的结合使用效果。
根视图是标签栏控制器,然后每页标签栏又有一个根视图控制器为导航栏控制器的标签,如下代码所示
01.
// 消息
02.
MessageViewController* msg = [[MessageViewController alloc] init];
03.
UINavigationController* navControloler = [[UINavigationController alloc] init];
04.
[navControloler pushViewController:msg animated:YES];
05.
[viewArray addObject:navControloler];
06.
07.
// 联系人
08.
ContactViewController* contact = [[ContactViewController alloc] init];
09.
navControloler = [[UINavigationController alloc] init];
10.
[navControloler pushViewController:contact animated:YES];
11.
[viewArray addObject:navControloler];
12.
13.
// 动态
14.
FavoriteViewController* favorite = [[FavoriteViewController alloc] init];
15.
navControloler = [[UINavigationController alloc] init];
16.
[navControloler pushViewController:favorite animated:YES];
17.
[viewArray addObject:navControloler];
18.
19.
// 标签栏控制器
20.
UITabBarController* tabBarController = [[UITabBarController alloc] init];
21.
tabBarController.viewControllers = viewArray;
22.
23.
// 修改根视图
24.
AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;
25.
appDelagete.window.rootViewController = tabBarController;
上述代码是在ViewController.m文件中,也就是说,APP的根视图控制器可以在AppDelegete外的其他地方修改,因此,可以设计出先显示登录界面,然后再显示程序的主页面,即标签栏页面视图。注意根视图是标签栏,所以返回按钮无效,如下所示
如果上述代码的根视图是导航栏,那么返回按钮是有效的,可以用作退出登录等类似的功能,其主要实现如下,在AppDelegate里设置根视图控制器
01.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
02.
{
03.
// Override point for customization after application launch.
04.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
05.
06.
UINavigationController* navController = [[UINavigationController alloc] init];
07.
[navController pushViewController:[[ViewController alloc] init] animated:YES];
08.
09.
self.window.rootViewController = navController;
10.
return
YES;
11.
}
然后ViewController中将标签栏控制器当做导航栏控制器的子视图Push进去,代码为
01.
- (
void
) loginSuccess
02.
{
03.
// 进入主界面,改变根视图
04.
NSMutableArray* viewArray = [[NSMutableArray alloc] init];
05.
06.
// 导航控制器+表标签栏控制器相结合使用,
07.
// 每个标签有一个根导航控制器
08.
09.
// 消息
10.
MessageViewController* msg = [[MessageViewController alloc] init];
11.
UINavigationController* navControloler = [[UINavigationController alloc] init];
12.
[navControloler pushViewController:msg animated:YES];
13.
[viewArray addObject:navControloler];
14.
15.
// 联系人
16.
ContactViewController* contact = [[ContactViewController alloc] init];
17.
navControloler = [[UINavigationController alloc] init];
18.
[navControloler pushViewController:contact animated:YES];
19.
[viewArray addObject:navControloler];
20.
21.
// 动态
22.
FavoriteViewController* favorite = [[FavoriteViewController alloc] init];
23.
navControloler = [[UINavigationController alloc] init];
24.
[navControloler pushViewController:favorite animated:YES];
25.
[viewArray addObject:navControloler];
26.
27.
// 标签栏控制器
28.
UITabBarController* tabBarController = [[UITabBarController alloc] init];
29.
tabBarController.viewControllers = viewArray;
30.
31.
#ifdef TABRoot
32.
// 修改根视图为标签栏控制器
33.
AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;
34.
appDelagete.window.rootViewController = tabBarController;
35.
#
else
36.
// 把标签栏视图控制器push到导航栏控制器内
37.
[self.navigationController pushViewController:tabBarController animated:YES];
38.
#endif
39.
}
其效果如下所示
导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用的更多相关文章
- iOS结合导航控制器和标签栏控制器
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...
- iOS:自定义工具栏、导航栏、标签栏
工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不 ...
- iOS: 状态栏、导航栏、标签栏、工具栏
三种项目栏总结: 工具栏:UIToolBar 导航栏:UINavigationBar 标签栏:UITabBar UIToolBar的按钮单元为:UIBarButtonItem UINavigati ...
- UINavigationController与UITabBarController相关问题
UINavigationController与UITabBarController相关问题 UINavigationController与UITabBarController混用是非常常见的,有时候会 ...
- iOS:视图切换的第二种方式:UINavigationController导航栏控制器
UINavigationController:一个以栈的形式管理多视图的容器,负责子控制器之间的跳转.由于以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,所以出栈后的视图会立即销毁. 介绍: & ...
- [Xcode 实际操作]三、视图控制器-(6)UINavigationController导航栏样式
目录:[Swift]Xcode实际操作 本文将演示对导航栏进行样式设置,以及更改导航顶部的提示区. 选择编辑第一个视图控制器文件. import UIKit class FirstSubViewCon ...
- [Xcode 实际操作]三、视图控制器-(4)使用UINavigationController导航栏和工具栏
目录:[Swift]Xcode实际操作 本文将演示如何显示和隐藏导航视图的导航栏和工具栏 打开第一个视图控制器 import UIKit class FirstSubViewController: U ...
- swift - 指定VC隐藏导航栏 - 禁用tabbar的根控制器手势,防止两个tabbar跳转 手势冲突
1. viewdidload 设置代理 self.navigationController?.delegate = self 2.代理里面指定VC 隐藏 //MARK: - 导航栏delegate e ...
- IOS 导航控制器基本使用(UINavigationController代码创建方式)
● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...
随机推荐
- 善待Redis里的数据--Unable to validate object
又是一篇关于姿势的文章,为什么是”又”呢?因为上个星期刚写完一篇关于Apache Commons Pool的正确使用姿势的文章,点击此处阅读. Redis为我们提供便利的同时,我们也要善待里面的数据 ...
- 跨越多台haproxy 跳转
<pre name="code" class="python">在zjtest5环境的haproxy上配置: 需要 访问acl host_zjcap ...
- 协方差cov
摘录wiki如下(红色字体是特别标注的部分): http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE 协方差 协方差(Covariance) ...
- 【LeetCode练习题】Reverse Linked List II
Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. F ...
- json概述及python处理json等数据类型
<一,概念> 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化(deserialization): ...
- 谈谈 WLST Custom Commands
在了解WLST定制命令之前,简单说一下WLST,WLST 全称叫Weblogic Scripting Tool, 它提供了一组预定义命令来方便Weblogic的用户通过命令行对Weblogic 实例, ...
- 菜鸟必须知道的linux的文件目录结构
Linux文件目录结 / 根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin bin就是二进制(binary)英文缩写.在一般的系统当中,你都可 ...
- 每日一小练——Eratosthenes 筛选法
上得厅堂.下得厨房,写得代码.翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数.可是 ...
- C#整理2——C#的输入输出及基本类型
//输出 Console.WriteLine("摩西摩西"); Console.Write("hollo");不带回车的 注意: 1.注意大小写敏感.(快捷键操 ...
- 【27前端】字体图标 Font Face
设计师做的高保真原型图,难免会用到艺术字体. 采用切片的方式,简单,粗暴,节省时间.除了retina屏其它兼容性也是一流.但是在修改的时候,会花很大的力气.即使只是修改文字大小,也需要重新切图,更别说 ...