导航栏控制器和标签栏控制器(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. }

其效果如下所示

转载于:https://www.cnblogs.com/Free-Thinker/p/5002898.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值