zoukankan      html  css  js  c++  java
  • 两种常见的UITabBarController+UINavigationController模式分析比较

    绝大部分软件都采用了UITabBarController+UINavigationController的设计模式,这是一种很主流很经典的设计方式,而另外一种UINavigationController+UITabBarController也是一种非常灵活的模式

    方式一:TabBarController的viewControllers + 一个NavigationController

    创建过程大概如下(关键代码):

    AppDelegate.m
    
    TabBarController *tabVC = [[TabBarController alloc]init];
    //全局就这一个导航控制器
    UINavigationController *nav =[[UINavigationController alloc] initWithRootViewController:tabVC];
    self.window.rootViewController = nav;
    
    TabBarController.m
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self addChildVc:[[ChatViewController alloc] init] title:@"Chat" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];
        [self addChildVc:[[ContactsListViewController alloc] init] title:@"Contact" image:@"tabbar_contacts" selectedImage:@"tabbar_contacts_selected"];
        [self addChildVc:[[MoreViewController alloc] init] title:@"More" image:@"tabbar_more" selectedImage:@"tabbar_more_selected"];
        [self addChildVc:[[ProfileViewController alloc] init] title:@"Profile" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];
    }
    
    - (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
    {
        childVc.title = title;
        childVc.tabBarItem.image = [UIImage imageNamed:image];
        childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        [self addChildViewController:childVc];
    }

    方式二:TabBarController的viewControllers + 多个NavigationController

    创建过程大概如下(关键代码):

    AppDelegate.m
    
    TabBarController *tabVC = [[TabBarController alloc]init];
    self.window.rootViewController = tabVC;
    
    TabBarController.m
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self addChildVc:[[ChatViewController alloc] init] title:@"Chat" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];
        [self addChildVc:[[ContactsListViewController alloc] init] title:@"Contact" image:@"tabbar_contacts" selectedImage:@"tabbar_contacts_selected"];
        [self addChildVc:[[MoreViewController alloc] init] title:@"More" image:@"tabbar_more" selectedImage:@"tabbar_more_selected"];
        [self addChildVc:[[ProfileViewController alloc] init] title:@"Profile" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];
    }
    
    - (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
    {
        childVc.title = title;
        childVc.tabBarItem.image = [UIImage imageNamed:image];
        childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        // 每一个控制器都是导航控制器
        UINavigationViewController *navigationVc = [[UINavigationViewController alloc] initWithRootViewController:childVc];
        [self addChildViewController:navigationVc];
    }

    对比分析

    第一种方式:

    导航控制器上的title不能和tabbar上面的同步,需要手动单独设置,比如可以在控制器的viewWillAppear:方法里面设置.

    第二种方式:

    tabbar上的标题默认会直接同步到导航控制器上.

    每个界面都有自己的导航控制器, 界面跳转都有自己的栈, 可能会更加灵活.

  • 相关阅读:
    C# PC版微信消息监听自动回复
    http ContentLength 为0 下载问题
    linq to entity不识别方法"System.String ToString()"
    android 环境搭建
    已备份数据库的磁盘上结构版本为 661。服务器支持版本 539,无法还原或升级此数据库
    android 百度地图 团队开发及正式apk发布
    Jquery UI Autocomplete 在mvc中应用
    <input type="image">表单提交2次 重复插入数据问题
    仿腾讯新闻时间轴效果
    项目管理笔记
  • 原文地址:https://www.cnblogs.com/Mr-zyh/p/8529770.html
Copyright © 2011-2022 走看看