iOS——present相关属性以及dismiss多级的方法

push和present

  1. 两者的区别
  • push:
    push由视图栈控制,每一个视图都入栈,调用之前的视图则需要出栈,可返回任意一层,一般用于同一业务不同界面之间的切换。
    push是由UINavigationController管理的视图控制器堆栈,在window下同时只能显示一个ViewController。
  • present:
    present弹出的视图是模态视图(我对模态视图的理解大概就是一个临时视图),只能逐级返回,一般用于不同业务界面的切换。
    present是由UIViewController管理的视图控制器堆栈,在window下可以以叠加的方式展示,当顶层的view透明时可以看到底层的view,但只有顶层的view可用户交互。

对push和present的其他补充在我以前的博客中写到过:UI学习之——iOS中界面的推出方法

presentingViewController和presentedViewController

presentedViewController和presentingViewController的区别:
presentedViewController和presentingViewController是UIViewController中的两个属性,例如,如果ViewControllerA调用present(_:animated:completion:)方法将ViewControllerB呈现出来,那么ViewControllerA就是presentingViewController,ViewControllerB就是presentedViewController。
这两个概念在使用Modal视图控制器时非常有用,因为它们允许您跟踪当前视图控制器的状态以及它所呈现的视图控制器。

  1. presentedViewController:由这个视图控制器或它最近的祖先呈现的视图控制器
  2. presentingViewController:呈现此视图控制器(或其最远祖先)的视图控制器

dismiss多级的方法:

这里我们使用几个案例来说明:
假设我们有6个视图控制器,颜色和层级关系分别是红->橙->黄->绿->蓝->紫。

dismiss到根视图控制器

按照之前所学的,如果我们直接用dismiss方法,视图会从当前层级跳转到上一层级,那么如果我现在想让它从当前视图控制器直接dismiss到根视图控制器,应该怎么做呢?
给出代码实现:

#import "FiveViewController.h"
#import "FourViewController.h"@interface FiveViewController ()@end@implementation FiveViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor purpleColor];UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];[button setTitle:@"切换" forState:UIControlStateNormal];button.frame = CGRectMake(100, 300, 200, 80);[button addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];}
- (void)press {//使用多级dismiss从当前视图返回根视图//首先创建一个UIViewController的实例对象,用于作为我们的根视图控制器//presentingViewController属性是指当前视图的上一个视图控制器,我们将刚刚创建的根视图控制器赋为当前视图的上一个视图UIViewController *rootViewController = self.presentingViewController;//进入一个循环,一直将该根视图控制器对象赋为它的前一个视图控制器,直到它的前一个视图控制器为nil,则表示我们找到了根视图控制器while (rootViewController.presentingViewController) {rootViewController = rootViewController.presentingViewController;}//使用dismiss回到根视图控制器[rootViewController dismissViewControllerAnimated:YES completion:nil];
}
@end

在该代码中,FourViewController是FiveViewController的上一级视图控制器,我们在当前页面先设置一个按钮,并为按钮设置事件函数。该事件函数中我们调用当前视图的presentingViewController属性来获取其上一级视图控制器对象,然后一直循环,直到我们获取到根视图控制器。

在此处,我一开始不理解为什么使用根视图控制器直接dismiss可以回到根视图控制器。因为之前一直以来,我对dismiss的理解都是“销毁当前视图控制器并返回上一级视图控制器”,而这里的rootViewController并不是当前视图控制器,它也没有上一级视图控制器,为什么能这样实现呢?
直到我查到了dismiss的文档描述:
如果您连续显示多个视图控制器,从而构建一个显示的视图控制器堆栈,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器和堆栈中该子级以上的所有视图控制器。当发生这种情况时,只有最上面的视图以动画的方式被取消;任何中间视图控制器都只是从堆栈中删除。最上面的视图将使用其模态转换样式来消除,这可能与堆栈中较低的其他视图控制器使用的样式不同。
原来是这样,因此,这里不光是根视图控制器,改为其他任何一个视图控制器都是同理

结果演示:
在这里插入图片描述

dismiss指定级数

这里演示dismiss两级:

#import "FourViewController.h"
#import "FiveViewController.h"@interface FourViewController ()@end@implementation FourViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor blueColor];UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];[button setTitle:@"切换" forState:UIControlStateNormal];button.frame = CGRectMake(100, 300, 200, 80);[button addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];UIButton *dismissTwoButton = [UIButton buttonWithType:UIButtonTypeSystem];[dismissTwoButton setTitle:@"dismiss两级(到黄色视图)" forState:UIControlStateNormal];dismissTwoButton.frame = CGRectMake(100, 500, 200, 80);[dismissTwoButton addTarget:self action:@selector(pressDismissTwo) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:dismissTwoButton];}
- (void)press {FiveViewController *five = [[FiveViewController alloc] init];[self presentViewController:five animated:YES completion:nil];
}- (void) pressDismissTwo {[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}@end

演示结果:
在这里插入图片描述

dismiss到目标视图控制器

通过dismiss跳转到目标视图控制器,同样也是要一级一级的通过presentingViewController属性进行遍历,不过这里的循环跳出条件是对便利到的视图控制器的类进行判断
代码实现:

#import "ThreeViewController.h"
#import "FourViewController.h"
#import "OneViewController.h"@interface ThreeViewController ()@end@implementation ThreeViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor greenColor];UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];[button setTitle:@"切换" forState:UIControlStateNormal];button.frame = CGRectMake(100, 300, 200, 80);[button addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeSystem];[dismissButton setTitle:@"dismiss到目标控制器(橙色)" forState:UIControlStateNormal];dismissButton.frame = CGRectMake(100, 500, 200, 80);[dismissButton addTarget:self action:@selector(pressDismiss) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:dismissButton];
}
- (void)press {FourViewController *four = [[FourViewController alloc] init];[self presentViewController:four animated:YES completion:nil];
}- (void) pressDismiss {//接下来演示从当前视图控制器dismiss到目标视图控制器//同样的,我们首先先创建一个视图控制器的实例对象,然后将其赋值为当前视图的前一个视图控制器UIViewController *muBiaoViewController = self.presentingViewController;//然后一样的进入while循环,但是此处不同的是出循环的条件是当该对象的父类是目标视图控制器类while (![muBiaoViewController isKindOfClass:[OneViewController class]]) {muBiaoViewController = muBiaoViewController.presentingViewController;}[muBiaoViewController dismissViewControllerAnimated:YES completion:nil];
}@end

在该代码中,ThreeViewController是当前视图控制器(绿色),FourViewController是当前视图控制器的上一级视图控制器,OneViewController是我们要跳转的目标视图控制器(橙色)。
演示结果:
在这里插入图片描述

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

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

相关文章

MySQL学习笔记

目录 注释1、启动和关闭MYSQL服务2、库的增删改查3、表的增删改查3.1 创建表3.2 修改表3.3 删除 4、数据类型4.1 字符串:char(num) 与 varchar(num)的区别4.2 整型4.3 浮点型4.4 日期型4.5 枚举型 注释 单行注释:#注释文字(没空格&#xff09…

如何运用yolov5训练自己的数据(手把手教你学yolo)

在这篇博文中,我们对YOLOv5模型进行微调,用于自定义目标检测的训练和推理。 目录 引言: YOLOv5是什么? YOLOv5提供的模型 YOLOv5提供的功能 使用YOLOv5进行自定义目标检测训练 自定义训练的方法 自定义训练代码 准备数据集 …

对话ChatGPT:AIGC时代下,分布式存储的应用与前景

随着科技的飞速发展,我们正步入一个被称为AIGC时代的全新阶段,人工智能、物联网、大数据、云计算成为这个信息爆炸时代的主要特征。自2022年11月以来,ChatGPT的知名度迅速攀升,引发了全球科技爱好者的极大关注,其高超的…

【跟小嘉学习区块链】二、Hyperledger Fabric 架构详解

系列文章目录 【跟小嘉学习区块链】一、区块链基础知识与关键技术解析 【跟小嘉学习区块链】一、区块链基础知识与关键技术解析 文章目录 系列文章目录[TOC](文章目录) 前言一、Hyperledger 社区1.1、Hyperledger(面向企业的分布式账本)1.2、Hyperledger社区组织结构 二、Hype…

AI-Chat,一款集全网ai功能的应用(附下载链接)

AI-Chat是一款综合性的聊天机器人,集成了多种先进的模型和功能。它采用了GPT4.0、联网版GPT和清华模型等多种模型,使得其具备更强大的语言处理能力。同时,AI-Chat还融合了AI绘画模型,例如Stable Diffusion绘画、文生图、图生图、艺…

数据结构与算法基础-(2)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

ElasticSearch - 分布式搜索引擎底层实现——倒排索引

目录 一、ElasticSearch 1.1、ElasticSearch 是什么? 1.2、ElasticStack 是什么? 1.3、正向索引和倒排索引 1.3.1、正向索引 1.3.2、倒排索引 a)倒排索引的创建过程: b)倒排索引的查询过程: c)分…

LeetCode讲解篇之347. 前 K 个高频元素

347. 前 K 个高频元素 文章目录 347. 前 K 个高频元素题目描述题解思路题解代码 题目描述 题解思路 根据数组频率倒序排序, 然后返回前k的个数据 题解代码 func topKFrequent(nums []int, k int) []int {m : make(map[int]int, 0)for i : len(nums) - 1; i > 0; i-- {m[n…

一拖三快充线(USB-C转三充)的解决方案--LDR6020P

DR6020P 是带有 3 组 6 路 DRP USB-C 及 PD 通信协议处理模块和 USB2.0 Device 功能的 16 位 RISC MCU,内置 8K16 位 MTP 程序存储器(可烧录 1000 次),512 字节的数据存储器(SRAM)。内置 LDO 5V 输出&#…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣(LeetCode)https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路: 数组充当哈希表…

Mysql004:用户管理

前言:本章节讲解的是mysql中的用户管理,包括(管理数据用户)、(控制数据库的访问权限)。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

数字IC设计系列----单端口RAM、双端口RAM

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据,每一个数据所占的bit位称之为位宽,这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0],这段内存空间中每一个数据的位宽为8bit&am…

Nuxt 菜鸟入门学习笔记:路由

文章目录 路由 Routing页面 Pages导航 Navigation路由参数 Route Parameters路由中间件 Route Middleware路由验证 Route Validation Nuxt 官网地址: https://nuxt.com/ 路由 Routing Nuxt 的一个核心功能是文件系统路由器。pages/目录下的每个 Vue 文件都会创建一…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️…

【Unity3D赛车游戏制作】开始界面场景搭建

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

大模型的最大bug,回答正确率几乎为零,GPT到Llama无一幸免

目录 前言 1.名字和描述颠倒一下,大模型就糊涂了 2.实验及结果 3.未来展望 前言 大模型的逻辑?不存在的。 我让 GPT-3 和 Llama 学会一个简单的知识:A 就是 B,然后反过来问 B 是什么,结果发现 AI 回答的正确率竟然是…

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样,它是独立安装和部署的,下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

2024年考研教育专业的教育综合考试大纲、样题和往年真题

根据教育部通知,2024年全国硕士研究生招生考试初试定于2023年12月23日至24日,即我们说的2024年考研时间为12月23-24日。距离现在只剩下3个月不到的时间,那么如何让我们在最后三个月内的复习和备考有效且高效呢? 结合很多清北复交研…

湖南麒麟两种修复硬盘方式

1、背景介绍 目前X86平台采用湖南麒麟3.3-3B系统,当遇到文件系统损坏时,可分下面两种情况进行文件系统修复 2、紧急模式下的修复 板子能进入系统,但是进入的是紧急模式,类似下面这种 此时可以直接输入修复命令进行系统修复 xf…

win11 允许使用脚本Set-ExecutionPolicy

目录 Set-ExecutionPolicy RemoteSigned notepad.exe $PROFILE Set-ExecutionPolicy RemoteSigned Set-ExecutionPolicy RemoteSigned 如果报错,执行: Set-ExecutionPolicy -Scope CurrentUser 然后就会提示我们输入,我们把刚刚的 Remot…