「iOS」push与present

news2024/12/23 8:05:13

iOS学习

  • 前言
  • push与pop
  • present与dismiss
  • 使用dismiss弹出多级
    • PresentedViewController 与 PresentingViewController区别
  • 总结

前言

在此前就学习过视图的push与present。与之对应的退出方法为pop与dismiss。这里进行一次总结。


push与pop

pushViewController 是通过导航控制器入栈的方式切换页面
方法使用为先创建一个视图,后push进栈:

    secondViewController *secondVC = [[secondViewController alloc] init];
   
    [self.navigationController pushViewController:secondVC animated:YES];

pop则是与之对应的弹出视图的方法,具体使用如下:

	//返回上一级
	[self.navigationController popViewControllerAnimated:YES];

	//返回根视图
	[self.navigationController popToRootViewControllerAnimated:YES];

	//返回指定级数 (objectAtIndex:参数为想要返回的级数)
	[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0]  animated:YES];

present与dismiss

presentViewController 是通过模态切换的方式切换页面
具体使用方法如下:

    secont_presentViewController *second_Pre = [[secont_presentViewController alloc] init];
    
    [self presentViewController:second_Pre  animated:YES completion:nil];

与push不同,present不需要使用导航控制器。因此不将视图压入导航控制器也可以推出。

对应的弹出视图的方法为dismiss

    [self dismissViewControllerAnimated:YES completion:nil];

使用dismiss弹出多级

PresentedViewController 与 PresentingViewController区别

PresentedViewController和PresentingViewController是UIViewController中的两个属性。

  • presentedViewController:The view controller that was presented by
    this view controller or its nearest ancestor. 由这个视图控制器或它最近的祖先呈现的视图控制器
  • presentingViewController:The view controller that presented this view
    controller (or its farthest ancestor.) 呈现此视图控制器(或其最远祖先)的视图控制器。

当我们对视图A使用present推出视图B时。
A.presentedViewController 就是B控制器;
B.presentingViewController 就是A控制器;

由此,我们可以通过判断presentingViewController属性是否存在,来跳转到根视图

-(void)btn_dismissToRoot
{
    UIViewController *rootVC = self.presentingViewController;
     while  (rootVC.presentingViewController ) {
              rootVC = rootVC.presentingViewController ;
             }
    [rootVC dismissViewControllerAnimated:YES completion:nil];
}

也可以直接dismiss到对应的presentingViewController属性的层级,来跳转到我们需要的视图中
如,跳转到上上个视图

    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];

或者通过判断是否为对应子类

-(void)btn_dismissTosecondTwo
{
    UIViewController *rootVC =  self.presentingViewController;
    while (![rootVC isKindOfClass:[secont_presentViewController class]])  {
        rootVC = rootVC.presentingViewController;
    }
    [rootVC dismissViewControllerAnimated:YES completion:nil];
}

实现效果:
请添加图片描述

总结

使用业务逻辑不同,界面推出的方式也不同。
present用于不同业务界面的切换。push用于同一业务不同界面之间的切换。
还值得我们注意的是,当我们present进入一个界面后,是不能push推出下一个界面的。这点会造成界面推出后无法收回,或者无法推出下一个界面的bug,以后遇到了再详细研究吧。

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

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

相关文章

黑神话:悟空 后话

《黑神话:悟空》在游戏界掀起了波澜。对许多人来说,包括我自己,这款游戏是我们一直期待的——一款纯粹、沉浸且专注于高质量游戏体验的作品。它不追求现代趋势,没有微交易或在线服务模式,也没有为了未来扩展包而设计的…

PumpkinFestival靶机详解

靶机下载地址 https://www.vulnhub.com/entry/mission-pumpkin-v10-pumpkinfestival,329/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sS -Pn -A -p- -n 192.168.229.163 访问网页 http://192.168.229.163/ 这些可能是用户名和账号留存 F12查看页面源码,发…

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法,本次使用了触觉智能的EVB3588开发板演示,搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计,为工业场景设计研发的模块化产品,10年以上稳定供货,帮助…

2024年9月18日历史上的今天大事件早读

1043年9月18日 范仲淹实行改革 1393年9月18日 “活财神”沈万三逝世 1783年9月18日 瑞士著名数学家欧拉逝世 1851年9月18日 《纽约时报》创刊 1903年9月18日 清末爱国将领冯子材逝世 1917年9月18日 护法战争爆发 1931年9月18日 “九一八”事变爆发 1936年9月18日 阎锡山…

SOMEIP_ETS_115: SD_Entry_references_more_options_than_exist

测试目的: 验证DUT能够拒绝一个订阅请求,该请求中的选项引用超出了实际存在的选项数量,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个引用了比实际存在的更多选项的Subscrib…

SPI中的CPOL和CPHA

SPI中的CPOL和CPHA学习SPI必须掌握的知识,因为它涉及到“数据位采集”。重点掌握空闲时SCK的电平是怎么定义的。采集时,是怎么规定发生在哪个时钟边沿。CPOL用来决定SPI总线在空闲时,SPI_SCK引脚输出的电平;CPHA用来决定“数据位采集点”发生在第几边沿。…

【Python】从基础到进阶(八):文件操作与上下文管理

🔥 个人主页:空白诗 文章目录 一、引言二、Python文件操作基础1. 打开文件2. 读取文件3. 写入文件4. 文件指针定位 三、上下文管理1. 使用with管理文件2. 自定义上下文管理器 四、文件操作的最佳实践五、案例:日志文件管理1. 需求分析2. 实现…

低代码技术:简化应用开发的未来

近年来,低代码技术作为一种新兴的应用开发方法,受到了广泛关注。低代码平台通过图形化的界面和预设的模块,使得用户能够以较少的代码编写工作创建应用程序。这一技术的发展,标志着软件开发过程中的一个重要变革。 低代码技术的基…

【Linux系统编程】第二十弹---进程优先级 命令行参数 环境变量

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程优先级 2.1、什么是优先级 2.2、优先级的描述 2.3、优先级与权限的关系 2.4、为什么要有优先级 2.5、Linux优先级的…

【产品更新】中汇保函及汇匠源保证金保函平台

中汇保函 新增 1.新增小程序查询验证功能,手机输入即可查验。 2.新增小程序客户案例案例,合作单位及案例展示页面。 3.履约保函、预付款保函、质量保函、工程款支付保函订单提交及订单状态查验。 4.PC产品官网已经上线,可随时访问了解产品介…

【Java】synchronized 基础线程安全

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在多线程编程中,线程安全是一个至关重要的概念。Java 提供了多种机制来处理线程安全问题,其中 synchronized 关键字是最常用和最基础的一种。本文将介绍线程安全问题的原因&a…

智创未来,景联文科技提供全方位数据采集服务

随着科技的日新月异,人工智能技术正在改变我们的生活与工作方式,数据成为推动人工智能(AI)技术发展的基石。 高质量的数据对于训练机器学习模型、提升算法性能以及实现智能应用的广泛部署至关重要。 景联文科技凭借卓越的技术实力…

Android14请求动态申请存储权限

Android14请求动态申请存储权限 Android14和Android15存储权限有增加多了选择部分,还是全部。一个小小的存储权限真的被它玩出了花来。本来Android13就将存储权限进行了3个细分,是图片,音频还是视频文件。 步骤一:AndroidManife…

六种主流ETL工具的比较与Kettle的实践练习指南--MySQL、hive、hdfs等之间的数据迁移

在数据集成和数据仓库建设中,ETL(Extract, Transform, Load)工具扮演着至关重要的角色。本文将对六种主流ETL工具进行比较,并深入探讨Kettle的实践应用。 一、六种主流ETL工具比较 1. DataPipeline 设计及架构:专为…

Python异常处理:自定义异常②

文章目录 1. 什么是自定义异常?2. 为什么需要自定义异常?3. 如何定义自定义异常?3.1 基本自定义异常3.2 带详细信息的自定义异常3.3 自定义异常的继承层次 4. 使用自定义异常4.1 抛出自定义异常4.2 捕获自定义异常 5. 自定义异常的应用场景5.…

【C++】透析string类

个人主页:CSDN_小八哥向前冲~ 所属专栏:C入门 目录 string类介绍 auto和范围for auto关键字 范围for string类常用接口说明 string类常见构造 string类容量操作 string类的访问及遍历操作 string类修改操作 string的结构说明 vs下的结构 G下的…

LibJPEG库使用_通过LibJPEG将RGB数据保存为JPG图片存储到磁盘

一、前言 LibJPEG库是一个广泛使用的开源C库,用于处理JPEG图像的压缩和解压缩。该库由独立JPEG小组(Independent JPEG Group, IJG)开发,提供了功能强大的API,用于创建和读取JPEG文件。LibJPEG库支持JPEG的所有常见功能…

Cpp快速入门语法(上)(1)

文章目录 前言一、C关键字(C98)二、命名空间命名空间的定义命名空间的使用 三、C输入 & 输出四、缺省参数总结 前言 其实有时候我也会尝试代入下祖师爷本杰明当年在贝尔实验室的心理活动,我心想,他可能一开始是大抵受不了C语言的某些缺点&#xff0c…

梦想之家|AI技术赋能家居,重塑生活空间

人工智能(AI)在智能家居方面的应用非常广泛,极大地提升了家庭的便利性、安全性和能源效率。当前,AI技术的迅速发展,为传统家居产品带来了智能化升级。从智能单品到智能互联,AI技术的融入使得这些家居产品具…