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.对操…

二元函数洛必达求极限_洛必达法则的几个例子

洛必达法则(LHpitals rule)是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法。 插入一个八卦: 据说洛必达法则是富二代洛必达买来的。喜欢搞数学却苦无天分的贵族洛必达用三百个里弗尔(一里弗尔相当于一磅银子)成功地从伯努力手里买到了这个定理。因此17世…

React-Native 获取设备当前网络状态 NetInfo

react-native 应用获取设备网络状态可以使用 NetInfo 包进行获取。 NetInfo NetInfo 模块可以获取设备当前的联网状态&#xff0c;可以订阅和一次性获取网络状态。以前在react-native集成&#xff0c;现在已经单独移到 react-native-community 社区管理。 安装(IOS需要pod in…

javascript V8引擎垃圾收集机制

V8引擎使用的垃圾收集机制是标记清除&#xff0c;那么javascript在垃圾收集会阻塞其他程序执行。V8引擎使用了增量标记的方式进行优化 增量标记 V8不是直接对整个栈堆遍历标记&#xff0c;而是标记一部分堆后回复正常执行。下次GC将从上一次停止对位置继续进行标记。这样允许在…

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;但是最终肯定还…

关于微信浏览器H5 React,Vue工程化项目input无法自动聚焦疑难杂症排查

前言 最近使用React开发微信H5搜索框自动聚焦功能&#xff0c;发现路由跳转页面后无法自动聚焦。尝试了各种方法均不生效…后来发型是异步加载组件问题&#xff0c;个人估计是微信浏览器在异步组件加载完成后导致节点失焦。 尝试过的解决方法 input 属性 autofocus —— 不生…

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

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

解析 react、vue等路由参数的库 path-to-regexp

React-router的路由系统内部中使用的是 path-to-regexp 解析匹配路由参数。具体用法如下 const { pathToRegexp } require("path-to-regexp")const regexp pathToRegexp("/:foo/:bar"); // keys [{ name: foo, prefix: /, ... }, { name: bar, prefix:…

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

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

交叉渡线道岔规格_交叉渡线道岔选择基本原则

交叉渡线道岔简介道岔是由一条线路分支进入或超越另一条线路的连接及交叉设备分支。道岔是铁路轨道结构中必不可少的一个重要组成部分。各国铁路道岔与线路的比例&#xff0c;随铁路运量、密度的不同而有很大差异。我国是铁路运量、密度较大的国家之一&#xff0c;因此我国铁路…

Jest 只MOCK模块中的某个功能实现

单元测试某些场景下只想模拟模块中的某个功能&#xff0c;并且保留模块原有的功能。这时候我可以用 jest.requireActual 配合 jest.mock 进行实现。 jest.requireActual 该API返回实际模块而不是模拟模块&#xff0c;绕过所有有关该模块是否应接收模拟实施的检查。为什么用 je…

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

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

jest 单元测试模拟模块设置动态值

在单元测试中需要对组件进行动态、极端、正常状态测试&#xff0c;如果组件里使用了api那么我们想对组件进行接口多种不同响应进行测试时候就需要对模块进行动态值设置。 mockFun.mockImplementation 接受应作为模拟的实现使用的函数。模拟本身仍然会记录所有进入的调用以及来…

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;虽…