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

    其效果如下所示

  • 相关阅读:
    OCP-1Z0-051-V9.02-55题
    OCP-1Z0-051-V9.02-60题
    OCP-1Z0-053-V12.02-59题
    OCP-1Z0-053-V12.02-184题
    OCP-1Z0-053-V12.02-595题
    OCP-1Z0-053-V12.02-584题
    OCP-1Z0-053-V12.02-234题
    OCP-1Z0-053-V12.02-548题
    OCP-1Z0-053-V12.02-549题
    OCP-1Z0-053-V12.02-551题
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5002898.html
Copyright © 2020-2023  润新知