导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用

很多时候,在UI设计方面同时需要使用导航控制器和标签栏控制器,这时,需要掌握如何设计结合使用这两种不同控制器。比如手机QQ,程序有三个标签栏(分别为消息、联系人、动态),同时在选择某个联系人或者会话时,会进入聊天的子页面,因此这里同时使用到了标签栏控制器和导航控制器。

我目前所知道有以下方法可实现上述的结合使用效果。

  • 根视图是标签栏控制器,然后每页标签栏又有一个根视图控制器为导航栏控制器的标签,如下代码所示

    // 消息
    MessageViewController* msg = [[MessageViewController alloc] init];
    UINavigationController* navControloler = [[UINavigationController alloc] init];
    [navControloler pushViewController:msg animated:YES];
    [viewArray addObject:navControloler];
    
    // 联系人
    ContactViewController* contact = [[ContactViewController alloc] init];
    navControloler = [[UINavigationController alloc] init];
    [navControloler pushViewController:contact animated:YES];
    [viewArray addObject:navControloler];
    
    // 动态
    FavoriteViewController* favorite = [[FavoriteViewController alloc] init];
    navControloler = [[UINavigationController alloc] init];
    [navControloler pushViewController:favorite animated:YES];
    [viewArray addObject:navControloler];
    
    // 标签栏控制器
    UITabBarController* tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = viewArray;
    
    // 修改根视图
    AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;
    appDelagete.window.rootViewController = tabBarController;

    上述代码是在ViewController.m文件中,也就是说,APP的根视图控制器可以在AppDelegete外的其他地方修改,因此,可以设计出先显示登录界面,然后再显示程序的主页面,即标签栏页面视图。注意根视图是标签栏,所以返回按钮无效,如下所示

  • 如果上述代码的根视图是导航栏,那么返回按钮是有效的,可以用作退出登录等类似的功能,其主要实现如下,在AppDelegate里设置根视图控制器
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // Override point for customization after application launch.
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
        UINavigationController* navController = [[UINavigationController alloc] init];
        [navController pushViewController:[[ViewController alloc] init] animated:YES];
    
        self.window.rootViewController = navController;
        return YES;
    }

    然后ViewController中将标签栏控制器当做导航栏控制器的子视图Push进去,代码为

    - (void) loginSuccess
    {
        // 进入主界面,改变根视图
        NSMutableArray* viewArray = [[NSMutableArray alloc] init];
    
        // 导航控制器+表标签栏控制器相结合使用,
        // 每个标签有一个根导航控制器
    
        // 消息
        MessageViewController* msg = [[MessageViewController alloc] init];
        UINavigationController* navControloler = [[UINavigationController alloc] init];
        [navControloler pushViewController:msg animated:YES];
        [viewArray addObject:navControloler];
    
        // 联系人
        ContactViewController* contact = [[ContactViewController alloc] init];
        navControloler = [[UINavigationController alloc] init];
        [navControloler pushViewController:contact animated:YES];
        [viewArray addObject:navControloler];
    
        // 动态
        FavoriteViewController* favorite = [[FavoriteViewController alloc] init];
        navControloler = [[UINavigationController alloc] init];
        [navControloler pushViewController:favorite animated:YES];
        [viewArray addObject:navControloler];
    
        // 标签栏控制器
        UITabBarController* tabBarController = [[UITabBarController alloc] init];
        tabBarController.viewControllers = viewArray;
    
    #ifdef TABRoot
        // 修改根视图为标签栏控制器
        AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;
        appDelagete.window.rootViewController = tabBarController;
    #else
        // 把标签栏视图控制器push到导航栏控制器内
        [self.navigationController pushViewController:tabBarController animated:YES];
    #endif
    }

    其效果如下所示

时间: 2024-08-09 20:02:11

导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用的相关文章

导航控制器和标签栏控制器

1. 导航控制器 1.1. 导航控制器的组成 1.2. 导航控制器的创建 1.3. 改变导航控制的关联视图 1.4. 实现导航 1.5. 添加标题 1.6. 设置导航栏颜色 1> 使用setBackgroudColor属性设置 2> 使用tintColor属性进行设置 1.7. 添加左右按钮 1> 静态添加按钮 2> 动态添加按钮 1.8. 设置返回按钮 2. 标签栏控制器 2.1. 标签栏控制器的创建 1> 静态创建标签栏视图控制器 2> 创建一个Tabbed App

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

<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc">- (void)initTabBar { // 初始化主页 HomePageViewController *homePage = [[HomePageViewController alloc]init]; UINavigati

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

<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc">- (void)initTabBar { // 初始化主页 HomePageViewController *homePage = [[HomePageViewController alloc]init]; UINavigati

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

工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不一定需要自己去创建,它们一般依附于导航控制器UINavigationController和标签栏控制器UITabBarControler.在导航控制器中,会有一个导航栏,它是显示的,还有一个工具栏,它默认是隐藏的,可以手动启用它.而标签栏控制器仅有一个标签栏.下面,我就来具体的用代码创建自定义的工具

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

三种项目栏总结: 工具栏:UIToolBar 导航栏:UINavigationBar 标签栏:UITabBar UIToolBar的按钮单元为:UIBarButtonItem UINavigationBar的按钮单元为:UINavigationItem UITabBar的按钮单元为:UITabBarItem 共同属性和方法: @property(nonatomic,copy)   NSArray   *items;                    //按钮单元数组 - (void)setI

UINavigationController导航栏,点击第二页按钮,传标题title到第一页成为第一页标题

深刻理解代理模式 将第一页设为第二页的代理,通过代理完成将第二页的按钮按钮颜色改变,按钮名称传到第一页作为第一页的标题 没有tag怎么找到你创建的试图控制器 在第二页压栈的时候将当前页(即导航栏控制器UINavigationController的根视图控制器此处我将第一页设为根)设为第二页的代理,这样就指定了第二页(指定的)的代理为第一页 第一种:因为已设置第一页为第二页的代理, 在第二页.m文件中写 First * fir =(First *) self.delegate]; 第二种:通过na

iOS菜鸟开发-2 导航栏主题

1.给每个子控制器添加导航栏 /** *  初始化一个子控制器 * *  @param child               需要初始化的子控制器 *  @param title               标题 *  @param imageName           未选中图标 *  @param selectedImageName   选中的图标 */ - (void)setupOneChildVC:(UIViewController *)child title:(NSString *

一张图让你清晰 UIViewController,UINavigationController和 UITabBarController的层次关系

在学习多视图控制器的时候,曾经有一个问题一直困扰着我,就是给标签栏title赋值的问题. 就常用的层次关系来说,一个标签栏视图 里面 套 一个 导航视图 ,导航视图 里 套 我们展示内容 的 内容视图 . UITabBarController->UINavigationController->UIViewController UITabBarController和UINavigationController 都继承自UIViewController UIViewControlleller  的

UINavigationController与UITabBarController相关问题

UINavigationController与UITabBarController相关问题 UINavigationController与UITabBarController混用是非常常见的,有时候会遇到UINavigationController推出(push)出controller后隐藏UITabBarController的问题,很容易对吧. 源码如下: // // AppDelegate.m // NavigationController // // Copyright (c) 2014年