IOS 导航控制器分为多层级导航控制器naviagtionController 和平行分栏控制器 UITabBar(底部切换栏)。IOS导航控制器是什么呢?其实就是我们web的路由切换功能,只不过在app开发切换是ViewController

什么是导航控制器 NavigationController ?

NavigationController 是继承ViewController实现的,我们可以理解为一个具有切换视图并保存视图栈记录的一个视图控制器,在开发中我们应该如何使用呢?那么NavigationController 是一个ViewController 说明我们可以把APP根视图替换成NavigationController进行路由。下面我们进行简单代码示例:

1. 首先修改SceneDeletgate自定义UIWindow和跟视图实现导航控制器

自定义UIWindow我们需要对info.plist修改一下配置,具体参考之前写的 Xcode11 后Appdelegate自定义UIWindow对象

// SceneDeletegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene* )scene];self.window.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);// 初始化第一级视图UIViewController* ROOTVC = [[ViewController alloc] init];// 初始化层级导航控制器UINavigationController* ROOTNavigation = [[UINavigationController alloc]initWithRootViewController:ROOTVC];self.window.rootViewController = ROOTNavigation;// 显示[self.window makeKeyAndVisible];
}

修改一下第一级视图的代码

ViewController.m
- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏的颜色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 设置导航栏文字颜色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本视图的导航标题self.navigationItem.title = @"首页";self.view.backgroundColor = [UIColor grayColor];
}

效果:

可以看到上ViewController代码self.navigationItem进行配置标题、self.navigationController配置颜色风格等。

self.navigationController 是什么?

每个视图控制器UIViewController都具有navigationController属性,这个属性指向是当前视图的导航控制器对象,也是当前导航控制器下视图都是指向它,其中一个UIViewController修改了NaviagtionConrtoller的属性其他视图层的导航控制器也会发生变化的。

self.navigationItem 是什么?

navigationItem属性其实是每个视图的导航栏配置项,可以单独配置当前的视图的导航的标题、左右两边按钮、颜色、风格等,只在当前视图层激活时候才生效。

如何切换视图 pushViewController

我们可以通过调用NavigationController的方法进行视图切换,下面简单演示一下视图切换功能。

// ViewController.m
- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏的颜色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 设置导航栏文字颜色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本视图的导航标题self.navigationItem.title = @"首页";self.view.backgroundColor = [UIColor grayColor];UIButton* _btn = [MyUI createButton:@"跳转"];_btn.frame = CGMakeRect(100, 100, 40, 100);[_btn addTarget:self action:@selector(go:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_btn];}- (void) go {UIViewController* view = [[UIViewController alloc] init][self.navigationController pushViewController:view animated:YES];
}

通过点击我们看到路由发生了切换和后退等功能。

UINavigationController 属性

名称 类型 说明 默认值
topViewController UIViewController 栈堆中的顶层视图控制器
visibleViewController UIViewController 返回当前激活(即显示)的视图控制器,如果不存在激活的视图,则返回栈堆中顶层的视图控制器
viewControllers NSArray<__kindof UIViewController *> 当前导航控制器的视图栈堆 []
navigationBarHidden BOOL 隐藏导航栏 NO
navigationBar UINavigationBar 导航控制器的导航栏对象 UINavigationBar
toolbarHidden BOOL 隐藏工具栏 YES
toolbar UIToolbar 导航控制器工具栏对象 UIToolbar

UINavigationController 方法

  • - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 是否开启动画切换视图,并且压入导航栈堆。

  • - (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated; 从栈堆弹出当前视图。并且返回剩余的视图栈堆

  • - (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 弹出视图栈堆,直到指定的视图控制器前面

  • - (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated 直接恢复到顶级视图层。

  • - (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated API_AVAILABLE(ios(3.0)) 直接设置新的视图栈堆,会跟当前顶级视图状态和新的视图栈堆来执行后退还是前进。

  • - (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated 隐藏导航栏

  • - (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated隐藏工具栏

…后续补充更多内容

IOS 多层级路由导航控制器 NavigationControoller 实现路由切换相关推荐

  1. IOS开发UI篇—导航控制器属性和基本使用

    IOS开发UI篇-导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...

  2. Vue声明式路由导航和编程式路由导航的优缺点及实现方法

    文章目录 前言 路由实现 1.目标 2.前置条件 <1>安装vue-router插件 <2>写个用于转跳的组件页 <3>写路由文件 <4>写路由锚点 3 ...

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

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

  4. Iphone开发用导航控制器实现视图的分层切换(UINavigationController)

    Iphone和android手机的一个不同的地方是,大部分的android手机都有返回键,而Iphone只有一个home键,所以我们会发现在Iphone的大部分应用中会在顶部有一个导航条,比如系统的设 ...

  5. Fiori学习笔记 - 路由导航

    路由导航在前端框架中占据这十分重要的地位.它决定了整个项目的结构.每个页面的跳转方式以及传参等等. Fiori的路由层级可以支持到二级或三级,并且可以通过 viewLevel 来指定路由层级,从而可以 ...

  6. 【Vue】vue中的路由导航守卫(路由的生命周期)

    文章目录 全局前置守卫 可选的第三个参数 `next` 全局解析守卫 router.beforeResolve 全局后置钩子 路由独享的守卫 组件内的守卫 可用的配置 API 使用组合 API 完整的 ...

  7. IOS开发入门(11)-导航控制器(1)

    IOS开发入门(11)-导航控制器I:层级结构和标签 前言:(直接从书上抄的) 大多数应用程序是由主视图导出多个屏幕,并且通常情况下实现屏幕切换的方法还不止一种.我们需要一种方式来实现用户在应用程序内 ...

  8. iOS 导航控制器、导航条、导航项、控制器的关系

    常见的APP的页面结构,分为两个横向和纵向两个维度,最为经典的就是横向维度采用UITabBarController,纵向维度采用UINavigationController.当然,横向维度还可以使用U ...

  9. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

最新文章

  1. MySQL与优化有关的命令_MySQL优化全攻略-相关数据库命令
  2. 年中盘点:2021年最炙手可热的10家AI初创公司
  3. 有关XSS编码问题的个人总结
  4. 服务器端利器--双缓冲队列
  5. Sql Server 监控 Job 执行情况
  6. 计算机的键盘如何保养,知识每天涨一点:快捷键2 键盘键位知识 电脑小保养
  7. Django编写RESTful API(二):请求和响应
  8. 在 Linux 中安装 VMware Tools
  9. 4-8 :button表单按钮选择器
  10. 关于DHCP超级域与中继代理的疑问
  11. 计算机技术中,下列的英文缩写和中文名字的对照中,正确的是,计算机技术中,下列的英文缩写和中文名字的对照中。正确的是(  )。 a.cad——计算机辅助制造b.cam——计...
  12. 谷歌推出3D社区“Lively” 挑战第二人生(组图)
  13. 32.从1到n整数中1出现的次数
  14. 构建一个简单的Keras +深度学习REST API
  15. 图像处理——打开DICOM图像
  16. 微信小程序选项卡功能
  17. 电路城 电路方案 51单片机开发板(原理图+PCB+学习程序源文件)
  18. PHP语言基本数据类型
  19. 计算机打印机出现副本1,打印机提示Administrator的1个文档被挂起
  20. ch341a刷写华擎(ASROCK)主板BIOS教程

热门文章

  1. linux 查看socket fd,linux socket中select()函数以及FD_ZERO FD_SET FD_CLR FD_ISSET
  2. vue中传值和传引用_vue prop属性传值与传引用示例
  3. win7如何关闭密码保护共享
  4. USB外接摄像头不能用怎么办
  5. 防止重复提交js jquery ajax
  6. 下如何查看mysql表单_Navicat 教程:如何进行表单查看
  7. restify mysql_[菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)[下]
  8. 学习Spring Boot:(一)入门
  9. angularjs input标签用一个日期插件后数据不能双向绑定了_微信如何定时发朋友圈?(最方便最好用的办法!)...
  10. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...