文档章节

UITabBarController和UINavigationController的区别

奋斗的青春年华
 奋斗的青春年华
发布于 2016/06/20 11:01
字数 1256
阅读 157
收藏 0

UITabBarController 和UINavigationController都可以作为 window的根控制器(rootViewController),但界面内容的展示样式是不同的。其区别如下:

1 UITabBarController的导航栏展示位置在屏幕的下方;而UINavigationController的导航栏展示位置在屏幕的上方。

2 UITabBarController的下一级控制器是其子控制器,可以有多个子控制器,默认子控制器展示   的顺序从第一个依次排放展示;UINavigationController的下一级控制器是其rootViewController,且只有一个根控制器。

3 当UITabBarController作为window的根控制器时,其子控制器可以是UINavigationController,也可以是普通控制器,也可以是两种类型的控制器都存在;但是在界面的效果是不一样的。当子控制器是UINavigationController时,其对应的界面会在屏幕的上方显示nav导航栏,并且不同的UINavigationController子控制器的nav导航栏可以设置不同的显示内容;而子控制器是普通控制器的界面不会展示nav导航栏。

4 当UINavigationController作为window的根控制器时,其rootViewController只能从UITabBarController和普通控制器中选择一种类型,因为器其rootViewContrlller只有一个。当选择UITabBarController时,而UITabBarController的子控制器在各自的控制器界面展示时,公有一个相同的nav导航栏在屏幕的上方,其内容是固定的,也是一样的。在屏幕的下方展示的是UITabBarController的子控制器

5 UIViewController的一个特别属性:当UIViewController的父控件,父父控件(即其上一级,上上一级等更高级控件)为tab bar controller,则该UIViewController就有一个属性UITabBarController *tabBarController,可以根据tabBarController对整个屏幕处理事件,tabBarController是控制器中的底层控制器了

6 关于bottomBar隐藏的处理方法 :当控制器是被一个带有tabBar导航栏的控制器push出来时,系统默认,该控制器会展示bottomBar,要隐藏该bottomBar,处理方法有:                                   1)使用viewController的bool属性:hidesBottomBarWhenPushed;具体是:                            - (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated

{

    viewController.hidesBottomBarWhenPushed = YES;

    [super pushViewController:viewController animated:animated];

}                                                                                                                                                     2) 当window的根控制器是UITabBarController,而UITabBarController的子控制器有UINavigationController,则该nav控制器push出来的控制器要隐藏bottomBar,也可以使用方法:

- (void)pushViewController:(nonnull UIViewController *)viewController animated:(BOOL)animated{

    [super pushViewController:viewController animated:animated];

        self.tabBarController.tabBar.hidden = YES;

}

使用上述两种方式bottomBar还是隐藏效果不好,使用终极方法:直接将最原始的tabBar隐藏掉,达到一键必除的效果。使用下面的代码,保证必有效果:

- (void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    [self.tabBarController.tabBar setHidden:YES];

}

7 当UINavigationController的根控制器又push很多的控制器(比如通过点击某个按钮而push出控制器)时,这时所有push出的控制器都会有navigationItem,且其样式是基本相同的,和UINavigationController中的设置是保持一致的;但是如果UINavigationController的根控制器是通过modal出来的控制器,则navigationItem不会在modal出来的控制器中显示。此时如果想让navigationItem也显示在屏幕的上方,可以有两种方式:

1) 不再使用modal方式,直接使用push方式

self.navigationController pushViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#>

2) 还是使用modal方式添加控制器,但是,对要modal的控制器进行一个navController的包装。如下面的情况:MYNavigationController是一个自定义的UINavigationController,self指的是一个任意的控制器(普通控制器 导航控制器),webController是要modal出的普通控制器

  MYNavigationController *navWebController = [[MYNavigationController alloc] initWithRootViewController:webController];

    [self      presentModalViewController:navWebController animated:YES];

8 关于navigationItem上的UIBarButtonItem按钮的问题:UINavigationItem上的常见的几个按钮属性:

@property(nullable,nonatomic,strong) UIBarButtonItem *backBarButtonItem;

@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;

@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;

@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);

@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);

这些按钮在navigationItem上的位置,可以使用两种方式来处理:MYSettingController是MYMyLotteryController通过MYMyLotteryController的navigationItem导航栏的一个设置按钮push出来的控制器。现在需要在MYSettingController的navigationItem导航栏上增加个右按钮叫做”常见问题"按钮,即navigationItem.rightBarButtonItem为常见按钮。处理方式为:

1)直接在MYSettingController的navigationItem导航栏上添加UIBarButtonItem常见问题按钮,但是这种方式一个缺点是,所有继承自MYSettingController的子控制器都会存在这个UIBarButtonItem常见问题按钮,可能有些子控制器并不需要这个按钮,因此这样做就不理想了

#import "MYSettingController.h"

   UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"常见问题" style:0 target:self action:@selector(itemClick)];

    self.navigationItem.rightBarButtonItem = item;

2)在MYMyLotteryController控制器中添加,这种方式可以让UIBarButtonItem常见问题按钮在子控制器中不显示。

#import "MYMyLotteryController.h"

 MYSettingController * settingController = [[MYSettingController alloc] init];

    settingController.title = @"设置";

 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"常见问题" style:0 target:self action:@selector(itemClick)];

    settingController.navigationItem.rightBarButtonItem = item;

    [self.navigationController pushViewController:settingController animated:YES];

 

9 设置导航栏的tintColor的方法:nav的导航栏底层颜色:[[UINavigationBar appearance] setBarTintColor:themeColor];  tabBar的导航栏的颜色: [[UITabBar appearance] setTintColor:themeColor];  其中themeColor是设定的任意颜色

© 著作权归作者所有

奋斗的青春年华
粉丝 1
博文 176
码字总数 109143
作品 0
浦东
私信 提问
UITabBarController的使用

先看效果图 一般为了实现底部导航和跳转子控制器.一般都是UITabBarController和UINavigationController嵌套使用 一般将ViewController添加到UINavigationController管理, 然后将UINavigatio...

luoruowen
2016/11/02
67
0
UINavigationController 和 UITabBarController(非基础使用,测试一下思路)

1、viewController都有nav 2、nav.root=TabBarController各个viewController 的区别 第一种 每个viewControll对应一个navigationcontroller 每个viewcontroller可以修改自己的nav title 第二......

asjoker
2016/09/08
5
0
AppDelegate 中跳转任意界面

(UIViewController*)topViewController { return [self topViewControllerWithRootViewController:self.window.rootViewController]; } - (UIViewController)topViewControllerWithRootViewC......

一剑定清风
2016/01/12
41
0
IOS 学习---视图,标签,导航控制器详解

当一个项目中UITabBarController,UIViewController三种控制器同时出现的时候,将标签控制器(UITabBarController)作为视图的根控制器,将创建的视图控制器作为标签控制器的子控制器。 //创建...

fengyun321
2015/09/12
50
0
高度自定义 TabBarController 组件--ESTabBarController

ESTabBarController 是一个高度自定义的 TabBarController 组件,继承自 UITabBarController,可轻松自定义 UI 样式,添加动画等。 功能 1、支持默认样式 如果直接使用ESTabBarController进行...

eggswift
2017/02/14
311
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
681
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
39
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
25
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
72
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
71
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部