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

「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.kler.cn/news/309139.html

相关文章:

  • Centos7安装gitlab-ce(rpm安装方式)
  • 干耳怎么掏耳朵?可视挖耳勺推荐平价
  • DeepFake换脸检测
  • 828华为云征文|基于华为云Flexus云服务器X实现个人博客搭建
  • SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;
  • Redis的缓存穿透、缓存雪崩、缓存击穿怎么解决
  • 【苍穹外卖】总结
  • 排序算法-选择排序
  • 深度学习自编码器 - 正则自编码器篇
  • 3.python 爬虫基础HTTP原理2和网页基础
  • Qt/C++ 了解NTFS文件系统,获取首张MFT表数据,解析文件记录头内容找到第一个属性偏移地址
  • 工具类中使用@Value注解引入静态地址
  • uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
  • GC垃圾回收机制-Serial GC
  • Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
  • Linux下root用户共享conda环境给其他用户
  • 力扣121-买卖股票的最佳时机(Java详细题解)
  • Encountered 31 files that should have been pointers, but weren‘t:(已解决,无废话)
  • System.out源码解读——err 和 out 一起用导致的顺序异常Bug
  • 论文翻译:USENIX-2021 Extracting Training Data from Large Language Models
  • 网络设备登录——《路由与交换技术》实验报告
  • 养宠浮毛严重怎么清理?希喂、范罗士、IAM宠物空气净化器真实测评
  • C++:初始化列表
  • 在线包装盒型生成工具,各种异型包装盒型,PDF导出方便
  • 【蜡笔小新专享】安装虚拟机、PHP、DVWA
  • Linux容器化管理——Docker常见命令总结
  • Apache Pulsar 与 Kafka Streams
  • React实现类似Vue的路由监听Hook
  • 在新电脑上将文件推送到已有的 Git 仓库
  • 【编程基础知识】Java命名规范及最佳实践