iOS开发UINavigation系列四——导航控制器UINavigationController

一、引言

在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationController是将这些控件和UIViewController紧密的结合了起来,使用导航,我们的应用程序层次会更加分明,对controller的管理也更加方便。前几篇博客地址如下:

UINavigationBar:http://my.oschina.net/u/2340880/blog/527706

UINavigationItem:http://my.oschina.net/u/2340880/blog/527781

UIToolBar:http://my.oschina.net/u/2340880/blog/528168

二、导航控制器的创建和controller的管理

导航控制器是一个堆栈结构,只是其中管理的对象是controller,通过push与pop进行controller的切换,我们有两种方式可以创建导航控制器:

?
1
2
3
4
//通过一个自定义的导航栏和工具栏创建导航控制器
- (instancetype)initWithNavigationBarClass:(nullable Class)navigationBarClass toolbarClass:(nullable Class)toolbarClass;
//使用系统默认的导航栏和工具栏,通过一个根视图创建导航控制器
- (instancetype)initWithRootViewController:(UIViewController *)rootViewController;

通过以下方法对视图控制器进行管理操作:

?
1
2
3
4
5
6
7
8
9
10
//设置管理的视图控制器
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated;
//压入新的视图控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
//弹出一个视图控制器 返回的是pop的controller
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
//弹出到某个视图控制器 返回所有pop的controller
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 
//直接pop到根视图控制器,返回所有被pop的controller
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

三、导航控制器中的常用方法和属性

?
1
2
3
4
//返回栈顶的controller
@property(nullable, nonatomic,readonly,strong) UIViewController *topViewController; 
//返回显示的controller
@property(nullable, nonatomic,readonly,strong) UIViewController *visibleViewController;

上面两个方法的区别在于,topViewController是返回被push出的最后一个controller,但是如果之后又有present进行莫泰跳转,visibleViewController会返回当前显示的controller。例如A-push-B-present-C,则topViewController会返回B,visibleViewController会返回C。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//返回堆栈中所有的controller
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;
//设置隐藏导航栏
@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;
- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;
//导航栏对象,只读属性
@property(nonatomic,readonly) UINavigationBar *navigationBar;
//隐藏状态栏
@property(nonatomic,getter=isToolbarHidden) BOOL toolbarHidden NS_AVAILABLE_IOS(3_0);
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated;
//状态栏对象
@property(null_resettable,nonatomic,readonly) UIToolbar *toolbar;
//导航中的返回手势对象
//iOS7之后,在导航中右划会进行pop操作,设置这个的enable可以控制设置手势是否失效
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer;

四、iOS8后导航的新特性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//这个方法是为了iOS方法的命名统一,在导航中,其作用和push一样
- (void)showViewController:(UIViewController *)vc sender:(nullable id)sender;
//弹出键盘的时候隐藏导航栏
@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenKeyboardAppears;
//屏幕滑动的时候隐藏导航栏,常用于tableView,上滑隐藏导航栏,下滑显示,带动画效果
@property (nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe;
//滑动隐藏导航栏的手势
@property (nonatomic, readonly, strong) UIPanGestureRecognizer *barHideOnSwipeGestureRecognizer;
//横屏的时候隐藏导航栏
@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenVerticallyCompact;
//敲击屏幕可以隐藏与显示导航栏
@property (nonatomic, readwrite, assign) BOOL hidesBarsOnTap;
//敲击屏幕的手势
@property (nonatomic, readonly, assign) UITapGestureRecognizer *barHideOnTapGestureRecognizer;

iOS8中增加的这些方法,不得不说着实在用户体验生进了一大步,从中也可以看出apple对于用户体验度的用心。

五、UINavigationDelegate

导航控制器还提供了一些代理回调方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
//视图将要展示时调用的方法
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
//视图已经展示时调用的方法
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
//设置方法设置导航控制器支持的设备方向
- (UIInterfaceOrientationMask)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0);
//这个方法设置导航控制器的首选设备方向
- (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0);
//下面两个方法可以对导航的转场动画进行设置
- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController;
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC ;

六、与UIViewController相关

当一个controller被添加到导航中后,系统会为它分配一些属性,如下:

?
1
2
3
4
5
6
//当前controller对应的导航项
@property(nonatomic,readonly,strong) UINavigationItem *navigationItem;
//push的时候隐藏底部栏,如push后隐藏tabbar
@property(nonatomic) BOOL hidesBottomBarWhenPushed;
//管理它的导航控制器
@property(nullable, nonatomic,readonly,strong) UINavigationController *navigationController;

iOS开发UINavigation系列四——导航控制器UINavigationController相关推荐

  1. IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...

  2. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  3. iOS导航控制器——UINavigationController使用详解

    一.概述 UINavigationController用来管理视图控制器,在多视图控制器中常用.它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹 ...

  4. ios 地图黑屏_ios – 导航控制器显示黑屏

    我正在学习iOS开发并遇到导航控制器的一些问题. 我创建了一个SingleView应用程序,然后使用"嵌入导航控制器"来获得导航控件. 我遇到的问题是,在应用程序成功构建之后,只有 ...

  5. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  6. IOS开发之视图和视图控制器

    视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一 ...

  7. 【IOS开发高级系列】异步绘制专题

    1 图片处理 1.1 编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGIm ...

  8. 【IOS开发进阶系列】动画专题

    1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hello_Hwc/archive/123447.html 1.1 基本概念 1.1.1 CA ...

  9. iOS开发学习系列(1)———Swift语言入门

    缘起 对于成为全栈开发者的目标而言,很好奇自己几年前怎么就没想过iOS开发的事情.iOS好歹也是移动操作系统两巨头之一.反思了下,有可能是因为之前对Object-C太无感导致的.现在趁着Swift,借 ...

最新文章

  1. 网络安全系列之九 WAF的基本配置
  2. 数据结构 - 把一个整数数组放到二叉树中使其有序(C++)
  3. 用python实现计算器功能_使用python实现计算器功能
  4. 织梦图集php,织梦图集在首页、列表页、内容页调用图集所有图片及注释的方法...
  5. 在将规则文件上传到sonarQube时,Findbugs配置文件无效错误
  6. 采访田飞师兄有感 ——by 李皈颖
  7. CmD空格转义的三种方法,总有一种会解决问题
  8. PHP:函数赋参数默认初值
  9. mysql 序列 语句_MySQL 序列使用
  10. lda 协方差矩阵_LDA算法详解
  11. 操作电脑时弹出 UAC被禁用 的解决方法
  12. Excel实用教程-IF函数怎么用
  13. 怎么知道云服务器cpu型号,云服务器cpu怎么查看
  14. 计算机考研复试(离散数学)
  15. 如何解决windows10 默认浏览器为不是Microsoft Edge(或者想改动)时出现闪退,且改动失败
  16. 解决HTML、PHP乱码问题
  17. STM32F030读取TMP275温度传感器,模拟iic。
  18. 净空法师:陈晓旭往生的教训(转载)
  19. 秘笈分享! 24 小时无人自习室为什么这么火?
  20. linux源代码哪里下载,Redhat的源代码在哪里下载

热门文章

  1. Pydoc 本地 HTML 形式查看
  2. Struts2零配置 Zero Config+CodeBehind
  3. hdu5062 简单题
  4. hdu3768 spfa+全排列
  5. 【C 语言】字符串操作 ( 使用 数组下标 操作字符串 | 使用 char * 指针 操作字符串 )
  6. 【Android 逆向】Android 系统文件分析 ( cpuinfo 处理器信息文件 | self 当前进程信息文件 | meminfo 当前内存信息文件 )
  7. 【错误记录】安卓编译错误 ( Could not find xxx.tools.build:aapt2 )
  8. 【Flutter】Animation 动画 ( Flutter 动画基本流程 | 创建动画控制器 | 创建动画 | 设置值监听器 | 设置状态监听器 | 布局中使用动画值 | 动画运行 )
  9. 【计算机网络】网络安全 : 公钥分配 ( 公钥使用者 | 公钥分配 | CA 证书格式 | CA 证书吊销 )
  10. IOS文本框readonly时焦点事件