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

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

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的切换,我们有两种方式可以创建导航控制器:


//通过一个自定义的导航栏和工具栏创建导航控制器

- (instancetype)initWithNavigationBarClass:(nullable Class)navigationBarClass toolbarClass:(nullable Class)toolbarClass;

//使用系统默认的导航栏和工具栏,通过一个根视图创建导航控制器

- (instancetype)initWithRootViewController:(UIViewController *)rootViewController;

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


//设置管理的视图控制器

- (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;

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


//返回栈顶的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。


//返回堆栈中所有的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后导航的新特性


//这个方法是为了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


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


//视图将要展示时调用的方法

- (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被添加到导航中后,系统会为它分配一些属性,如下:


//当前controller对应的导航项

@property(nonatomic,readonly,strong) UINavigationItem *navigationItem;

//push的时候隐藏底部栏,如push后隐藏tabbar

@property(nonatomic) BOOL hidesBottomBarWhenPushed;

//管理它的导航控制器

@property(nullable, nonatomic,readonly,strong) UINavigationController *navigationController;

目录
相关文章
|
iOS开发
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
625 9
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
1147 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
777 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
2110 11
|
人工智能 程序员 API
iOS|记一名 iOS 开发新手的前两次 App 审核经历
啥,这玩意也有新手保护期?
624 0
|
物联网 Android开发 iOS开发
iOS开发 - 蓝牙学习的总结
iOS开发 - 蓝牙学习的总结
489 0
潇
|
iOS开发 内存技术 图形学
IOS开发---菜鸟学习之路--(五)-MacBook购买前后感想
前几天刚入手了一台MACBOOK AIR 13寸 13版的 这几天使用过来个人感觉还是非常不错的。 这几天每天晚上都抱着她玩到十一、二点。 今天晚上突然想起来好久没续写博客了。就连忙开始码字了。 此章大部分内容都是杂谈。
潇
1241 0
潇
|
iOS开发 容器
IOS开发---菜鸟学习之路--(六)-UITableView几个方法的使用说明
对于UITableView的基础使用我这边就不做重复介绍了 我重点就来介绍下如何实现大部分新闻的界面。也就是第一条记录显示大图片下面加一段文字说明 然后剩下来的内容全部显示为文字图片的格式 其实要做到这样的效果是非常容易。
潇
1182 0
潇
|
iOS开发
IOS开发---菜鸟学习之路--(七)-自定义UITableViewCell
本篇将介绍如何自定义 UITableViewCell 首先选择新建文件 可以直接使用快捷键 COMMAND+n打开新建页面,然后选Objective-C class 然后选择继承之UITableViewCell 类 同时输入 类名   完成这一步之后 我们还要继续新建一个XIB 文件...
潇
1214 0
潇
|
iOS开发 数据格式 JSON
IOS开发---菜鸟学习之路--(八)-实现新闻页面
本章将具体讲述如何结合前两张的内容最终实现一个新闻页面的雏形 之所以称之为雏形,是因为本章实现的内容只是实现了最基础的效果 还有很多其他诸如下拉刷新 页面导航等效果都需要投入一些时间进行研究  好了直接开始整题吧 首先在我们需要新建一个ViewController 同时呢需要勾选 需要创建X...
潇
1264 0