很多时候,在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)混用的更多相关文章

  1. iOS结合导航控制器和标签栏控制器

    <span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...

  2. iOS:自定义工具栏、导航栏、标签栏

    工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不 ...

  3. iOS: 状态栏、导航栏、标签栏、工具栏

    三种项目栏总结: 工具栏:UIToolBar 导航栏:UINavigationBar 标签栏:UITabBar   UIToolBar的按钮单元为:UIBarButtonItem UINavigati ...

  4. UINavigationController与UITabBarController相关问题

    UINavigationController与UITabBarController相关问题 UINavigationController与UITabBarController混用是非常常见的,有时候会 ...

  5. iOS:视图切换的第二种方式:UINavigationController导航栏控制器

    UINavigationController:一个以栈的形式管理多视图的容器,负责子控制器之间的跳转.由于以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,所以出栈后的视图会立即销毁. 介绍: & ...

  6. [Xcode 实际操作]三、视图控制器-(6)UINavigationController导航栏样式

    目录:[Swift]Xcode实际操作 本文将演示对导航栏进行样式设置,以及更改导航顶部的提示区. 选择编辑第一个视图控制器文件. import UIKit class FirstSubViewCon ...

  7. [Xcode 实际操作]三、视图控制器-(4)使用UINavigationController导航栏和工具栏

    目录:[Swift]Xcode实际操作 本文将演示如何显示和隐藏导航视图的导航栏和工具栏 打开第一个视图控制器 import UIKit class FirstSubViewController: U ...

  8. swift - 指定VC隐藏导航栏 - 禁用tabbar的根控制器手势,防止两个tabbar跳转 手势冲突

    1. viewdidload 设置代理 self.navigationController?.delegate = self 2.代理里面指定VC 隐藏 //MARK: - 导航栏delegate e ...

  9. IOS 导航控制器基本使用(UINavigationController代码创建方式)

    ● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...

随机推荐

  1. 小巧数据库 Derby 使用攻略

    阅读目录 1. Derby 介绍 2. 稍稍配置下环境变量 3. Derby 操作和 Java 访问 回到顶部 1. Derby 介绍 将目光放在小 Derby 的原因是纯绿色.轻巧.内存占用小,分分 ...

  2. linux下so动态库一些不为人知的秘密(中)

    上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...

  3. oracle error info

    1,oracle jdbc HTTP Status 500 - Incorrect result size: expected 1, actual 0 2015-03-31 00:03:58,250 ...

  4. flex——dictionary跟Object的区别与遍历

    AS3中Object和 Dictionary都可以用来保存key-value形式的数据,Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键.例如 ...

  5. Matlab lugui

    function [L,U,pv,qv] = lugui(A,pivotstrat) %LUGUI Gaussian elimination demonstration. % % LUGUI(A) s ...

  6. UVA 1613 K-Graph Oddity

    题意; 在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同. 分析: k=所有点中最大的入度.如果最大入度是偶数,则k+1.每个点可选 ...

  7. web中通过注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]>版本

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...

  8. Android SDK开发常用工具的使用及其异常处理

    由于以下操作都是命令操作,所以在执行以下操作之前确保环境变量 ANDROID_HOME 指向的是正确的Android SDK的路径: 一.启动Android SDK Manager: android ...

  9. 用GoEasy推送实现Java实时推送

    前段时间客户有个需求他希望他在后台管理页面发布一个消息,所有用这个系统的用户无论在哪个页面都能及时收到他发布的信息,以前对于类似需求在少量 页面接收的前提下,我一般采用ajax定时去服务器pull信息 ...

  10. HMM模型实例 mahout官网上的案例

    原理:http://www.cnblogs.com/CheeseZH/p/4229910.html Example To build a Hidden Markov Model and use it ...