导航栏控制器和标签栏控制器(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 *)launchOptions02.{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) loginSuccess02.{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 TABRoot32.// 修改根视图为标签栏控制器33.AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;34.appDelagete.window.rootViewController = tabBarController;35.#else36.// 把标签栏视图控制器push到导航栏控制器内37.[self.navigationController pushViewController:tabBarController animated:YES];38.#endif39.}其效果如下所示

导航栏控制器和标签栏控制器(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 ...
随机推荐
- WindowProc和DefWindowProc的区别
1. WindowProc是你给自己的窗口定义的窗口处理函数 DefWindowProc是windows平台提供的默认窗口处理函数 如果某些消息你不需要做特别的处理,调用DefWindowProc进行 ...
- IOS中http请求使用cookie
http://rainbird.blog.51cto.com/211214/805173 IOS中http请求使用cookie 2012-03-13 23:04:30 标签:http 记录 龙的传人 ...
- OC基础5:继承
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.根类即是最顶层的类,父类也可称为超类: ...
- Linux下更新瑞芯微固件
有这样的需求,是因为提供的BSP中是在windows下烧写的系统.我直接在linux下开发,每次编译后代码都要在windows下烧写,是一个很麻烦的事情.为了解决这个问题我尝试着用VirtualBox ...
- Android长方形图片生成正圆形,以及矩形图片生成圆角
一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public ...
- android卸载反馈实现
博客原地址:http://blog.csdn.net/wang_shaner/article/details/41543787 实现原理 fork分叉函数 fork分叉(分裂)函数可以创建一个新进程, ...
- 优先队列(priorityqueue)
队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...
- 《JavaScript 闯关记》之初探
当学习一门新的编程语言的时候,应该边学边做,反复演练以加深理解.因此,你需要一个 JavaScript 解释器.幸运的是,每一个 Web 浏览器都包含一个 JavaScript 解释器. 可以通过在 ...
- html加载js那些事
浏览器通过内置的JavaScript引擎,读取网页中的代码,对其处理后运行. JavaScript代码嵌入网页的方法 在网页中嵌入JavaScript代码有多种方法. 直接添加代码块 通过script ...
- SVG彩虹字
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...