当前位置: 首页 > news >正文

「iOS」push与present

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.mrgr.cn/news/29276.html

相关文章:

  • uniapp使用echarts
  • 基于SSM(Spring + Spring MVC + MyBatis)框架开发的电能计量与客服服务管理系统
  • docker搭建guacamole,web远程桌面
  • 看懂本文,入门神经网络Neural Network
  • openpyxl处理Excel模板,带格式拷贝行和数据填入
  • 寻找治愈系日落美景素材 这几个网站让视频剪辑更有温度
  • 智能生成ppt使用什么软件?这些AI应用不容错过
  • html详细知识
  • JMeter 中使用 Gson 操作请求中的Boby参数
  • 【mechine learning-11-梯度下降的数学公式推导】
  • 直流斩波电路
  • Selenium with Python学习笔记整理(网课+网站)
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析03-Numpy环境搭建
  • 换脸动漫转真人:ComfyUI无实物Cosplay
  • 养殖场中的分布式光伏发电
  • iptables限制网速
  • Android AlertDialog圆角背景不生效的问题
  • 昆明网站制作流程与设计技巧
  • 【C++】日期类基础题
  • 【C++】探秘二叉搜索树
  • C++速通LeetCode中等第3题-字母异位词分组
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • 交流电力控制电路之交流调压电路
  • docker镜像加速器,亲测可用。
  • 基于C++实现(控制台)仓库管理系统
  • AI雷达智能电子名片小程序源码系统 人人可以创建属于自己的名片 带完整的安装代码包以及的搭建部署教程