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

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 属性

名称类型说明默认值
topViewControllerUIViewController栈堆中的顶层视图控制器
visibleViewControllerUIViewController返回当前激活(即显示)的视图控制器,如果不存在激活的视图,则返回栈堆中顶层的视图控制器
viewControllersNSArray<__kindof UIViewController *>当前导航控制器的视图栈堆[]
navigationBarHiddenBOOL隐藏导航栏NO
navigationBarUINavigationBar导航控制器的导航栏对象UINavigationBar
toolbarHiddenBOOL隐藏工具栏YES
toolbarUIToolbar导航控制器工具栏对象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隐藏工具栏

…后续补充更多内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端性能优化篇——浏览器同域名并发请求对限制

在浏览器同域名并发请求都产生并发数限制&#xff0c;并发限制通常是4&#xff5e;8以内&#xff0c;那么来了解浏览器请求并发限制的原因和优化手段。浏览器并发数量统计 浏览器为什么要请求并发数限制&#xff1f;在了解优化手段之前我们先了解浏览器限制并发请求的原因1.对操…

帧大小超过交换机mtu_交换机的三种交换方式

交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备&#xff0c;它可以为接入交换机的任意两个网络节点提供独享的电信号通路。交换机拥有一条高带宽的背部总线和内部交换矩阵&#xff0c;在同一时刻可进行多个端口对之间的数据传输&#xff0c;交换机的传输模式…

前端性能优化篇——浏览器http同域名并发请求对限制

在浏览器同域名并发请求都产生并发数限制&#xff0c;并发限制通常是4&#xff5e;8以内。那么我们将来了解浏览器请求并发限制的原因和优化手段。 浏览器并发数量统计 浏览器为什么要请求并发数限制&#xff1f; 在了解优化手段之前我们先了解浏览器限制并发请求的原因 1.对操…

rstudio的数据集怎么建立和保存_这个40M的小工具助你在windows下处理数据如虎添翼...

使用windows系统时&#xff0c;如何获取一个大小为1M的文件的行数呢&#xff1f;一般是选择用excel或notepad等软件打开文件&#xff0c;然后查看最后一行的行号&#xff0c;那如果是想快速获取一个大小为1G的文件的行数呢&#xff1f;或是想快速获取100个大小为1M的文件的行数…

mongo 唯一约束索引_Java:MySQL 基础知识+索引相关

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&…

Javascript性能优化【内联缓存】 V8引擎特性

javascript 是单线程、动态类型语言&#xff0c;那么我们在编码时候如何编写性能最优代码呢&#xff1f;下面将讲解V8引擎的内联优化。利用内联缓存这个特性我们可以编写更加优秀的代码。 什么是内联缓存 引用官方的描述&#xff1a;内联缓存&#xff08;Inline caching&#…

bootstrap 垂直居中 布局_CSS3 flex 布局必须要掌握的知识点

flex 布局已经流行好久了&#xff0c;从最开始大家都在用非官方标准的 box 布局(display: box; display: -webkit-box;)&#xff0c;到后来的各种兼容写法&#xff0c;再到后来基本上就是只用 flex 了。毕竟标准就是标准&#xff0c;虽然有时候会迟到&#xff0c;但是最终肯定还…

如何在代码中让按钮高亮_各种博客的代码高亮是如何实现的

本文来自 「Vue虚拟实验」的小伙伴 余xiaoy&#xff0c;在做 Lovue 项目的时候&#xff0c;他负责了代码高亮显示功能&#xff0c;目前实现了代码高亮、主题切换、某行代码特殊显示、显示行号等功能&#xff0c;效果如下。下面介绍如何通过 Vue 来完成这个功能&#xff1a;Vue…

如何把表格做成源代码_他来了,他来了,文字、表格、公式图片识别神器V0.1测试版...

他来了&#xff0c;他来了&#xff0c;Mathpix拜拜了~~~文字、表格、公式图片识别神器V0.1测试版俺不是标题党&#xff01;&#xff01;&#xff01;开发背景日常工作中经常遇到大量的图片版文本、表格、公式需要编辑&#xff1b;用手敲&#xff1f;也太OUT了吧&#xff0c;好歹…

离线登陆_iphone手机,苹果手机如何登陆网易163邮箱

在使用iPhone系统邮箱的时候&#xff0c;我们在配置的时候可能会遇到各种各样的问题&#xff0c;导致无法在系统邮件里面使用163邮箱。主要是手机客户端的密码和网页登陆的密码是不一样的。常见问题下面就是有人在使用的时候遇到的问题&#xff1a;登陆密码错误有人知道怎么在i…

Vue 封装echarts饼状图(Pie)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 效果显示&#xff1a; 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title"><div>{{ title }}</div>…

积分上下限无穷_数学分析|第九章 定积分利用等价无穷小量和定积分定义解决数列极限问题总结...

当公式或文字展示不完全时&#xff0c;记得向左←滑动哦&#xff01;摘要&#xff1a; 当我们利用等价无穷小量时&#xff0c;不仅仅可以利用等价替换&#xff0c;有的时候我们需要利用极限的定义语言来解决问题&#xff0c;当等价无穷小量和连加数列结合在一起时&#xff0c;虽…

关于配置Webapck的 exclude 不过滤 node_modules Babel却没有处理转换node_modules的源码

最近对公司的项目引入了 nanoid 替换 uuid 的使用。但是在sentry日志中发现Unexpected token >的错误。立马查看编译后bunld发现 nanoid 箭头函数没有被转换。所以对此记录一下原因和解决办法。 报错的原因 1.nanoid 源码是没有经过babel转换的。 查看nanoid的源码&#x…

android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线&#xff0c;大家肯定都不陌生&#xff0c;网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图。以下两个是比较经典的动图了。二阶贝塞尔曲线&#xff1a;三阶贝塞尔曲线&#xff1a;由于在工作中经常要和贝塞尔曲线打交道&#xff0c;所以简单说一下自己的…

Node.js Event loop 图解

直接上自己制作的流程图

支持串行隔离级别_从0到1理解数据库事务(上):并发问题与隔离级别

最近准备写一篇关于Spanner事务的分享&#xff0c;所以先分享一些基础知识&#xff0c;涉及ACID、隔离级别、MVCC、锁&#xff0c;由于太长&#xff0c;只好拆分成上下两篇&#xff1a;上&#xff1a;并发问题与隔离级别主要讲事务所要解决的问题、思路&#xff0c;先理解为什么…

如何发布接口_Devops下的接口全生命周期管理与测试

什么是devops&#xff1f;随着时间的推移&#xff0c;devops的定义也在不断的演进。对于其定义可能出现千人千面&#xff0c;但从核心观点&#xff0c;整体业界还是保持着一致的认识。DevOps不是单一的技术或者工具&#xff0c;甚至不只是一个流程&#xff0c;而是包含应用设计…

查看mysql日志post_(转)MySQL 日志组提交

原文:https://jin-yang.github.io/post/mysql-group-commit.html组提交 (group commit) 是为了优化写日志时的刷磁盘问题&#xff0c;从最初只支持 InnoDB redo log 组提交&#xff0c;到 5.6 官方版本同时支持 redo log 和 binlog 组提交&#xff0c;大大提高了 MySQL 的事务处…

like语句太慢 sqlserver_SQLServer找出执行慢的SQL语句

SELECT(total_elapsed_time / execution_count)/1000 N平均时间ms,total_elapsed_time/1000 N总花费时间ms,total_worker_time/1000 N所用的CPU总时间ms,total_physical_reads N物理读取总次数,total_logical_reads/execution_count N每次逻辑读次数,total_logical_reads N逻辑…

苹果cms10自适应模板_哪里有苹果cms10自适应模板?

1&#xff0c;苹果CMSv10大图轮播高端大气自适应视频网站模板源码苹果cms10自适应模板下载地址&#xff1a;https://www.mytheme.cn/maccms/54.html第一款大图宽屏的海报轮播幻灯样式&#xff0c;宽屏模板支持DIY扩展自适应影视模板苹果cms10自适应模板苹果cms10自适应模板2&am…