博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用
阅读量:5938 次
发布时间:2019-06-19

本文共 3459 字,大约阅读时间需要 11 分钟。

很多时候,在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.
}

其效果如下所示

转载地址:http://tjvtx.baihongyu.com/

你可能感兴趣的文章
详解分布式应用程序协调服务Zookeeper
查看>>
软件工程之构建之法
查看>>
UVa 10902
查看>>
Mathf.Sin正弦
查看>>
禁止浏览器缓存js
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
java中string和int互相转化
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
新学期的合作
查看>>
Python_练习题_49
查看>>
[Angularjs]单页应用之分页
查看>>
js---对象 和 函数this
查看>>
VC 6.0的简单使用
查看>>
IE6 兼容问题总结
查看>>
[转载] 民兵葛二蛋——第17集
查看>>
[转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
查看>>
【leetcode】75.Sort Colors
查看>>
Xcode常用快捷键
查看>>
如何快速有效的投诉上海移动
查看>>