【iOS】push和pop、present和dismiss

目录

前言

  push 和 present 是两种用于导航和切换视图控制器(ViewController)的常用方法,push与present都可以推出新的界面,present与dismiss对应,push和pop对应。

present只能逐级返回,push所有视图由视图栈控制,可以返回上一级,也可以返回到根vc或其他vc。

push和pop

push和pop分别用于在导航控制器中添加视图控制器、移除视图控制器。

push

push 方法通常与导航控制器(UINavigationController)一起使用。当我们调用一个视图控制器的pushViewController:animated: 方法时,即会将新的视图控制器"推入"导航堆栈的顶部,且会创建一个向右滑动的动画效果,并且新的视图控制器会成为当前显示的视图控制器。

当我们想要在应用程序中创建一个导航层次结构时,比如在不同的层级之间切换,如从列表到详情。用户可以通过按下导航栏上的返回按钮或手势滑动来返回到先前的视图控制器。

示例代码:

objectivec 复制代码
UIViewController *viewController = [[UIViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];

pop

从导航堆栈中移除当前视图控制器,返回到之前的视图控制器。使用popViewControllerAnimated:方法,实现用户点击返回按钮或手势滑动返回上一个视图控制器功能。

示例代码:

objectivec 复制代码
[self.navigationController popViewControllerAnimated:YES];

present和dismiss

present和dismiss分别用于呈现模态视图控制器和关闭模态视图控制器。

模态对话框(Modal Dialog)是一种用户界面元素,它用于在应用程序中临时显示一个窗口,要求用户进行交互,同时阻止用户与应用程序的其他部分进行交互,直到对话框关闭。在模态对话框显示期间,用户必须对对话框进行响应,才能返回到应用程序的主界面。

present

present 方法用于模态地呈现一个视图控制器。当你调用一个视图控制器的 presentViewController:animated:completion: 方法时,你正在将新的视图控制器覆盖在当前视图控制器之上。这通常用于显示一个临时的界面,如弹出窗口、警告框或表单。

当你想要显示一个临时的视图控制器,用户需要与之交互,比如登录窗口、设置选项或表单。

当你不需要导航堆栈来管理视图控制器时,比如在游戏或媒体播放器中。

示例代码:

objectivec 复制代码
UIViewController *viewController = [[UIViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];

dismiss

关闭当前模态呈现的视图控制器,返回到之前的视图控制器。

使用dismissViewControllerAnimated:completion:方法,实现用户完成模态视图控制器中的操作(如填写表单、查看图片后)并关闭它的功能。

示例代码:

objectivec 复制代码
[self dismissViewControllerAnimated:YES completion:nil];

实现模态对话框代码示例

  1. 创建并呈现模态对话框
objectivec 复制代码
// 创建一个新的视图控制器实例,这将作为模态对话框
UIViewController *modalViewController = [[UIViewController alloc] init];

// 配置模态对话框视图控制器的属性,如视图背景色、大小等
modalViewController.view.backgroundColor = [UIColor whiteColor];
modalViewController.modalPresentationStyle = UIModalPresentationStyleOverFullScreen; // 设置模态样式

// 呈现模态对话框
[self presentViewController:modalViewController animated:YES completion:nil];
  1. 关闭模态对话框
objectivec 复制代码
// 在模态对话框中添加一个按钮,用于关闭对话框
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
[closeButton setTitle:@"Close" forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(closeModal) forControlEvents:UIControlEventTouchUpInside];
[modalViewController.view addSubview:closeButton];

// 实现关闭模态对话框的方法
- (void)closeModal {
    // 调用 dismiss 来关闭模态对话框
    [self dismissViewControllerAnimated:YES completion:nil];
}

区别

导航堆栈:push 将视图控制器添加到导航堆栈中,而 present 不会。

返回方式:使用 push 时,用户可以通过物理返回按钮或手势返回到前一个视图控制器。使用 present 时,通常需要实现一个关闭按钮或手势来关闭模态视图控制器。

动画效果:push 通常向右滑动,而 present 的动画效果可以自定义,通常从底部或中间弹出。

使用上下文:push 适用于导航结构,present 适用于模态对话框。

总结

present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换。

导航控制器(UINavigationController):主要用于管理视图控制器的堆栈,支持 push 和 pop 操作。

模态呈现(Modal Presentation):不涉及导航堆栈,用于临时显示视图控制器,支持 present 和 dismiss 操作。

返回按钮和关闭按钮:在 pop 和 dismiss 操作中,通常有返回按钮或关闭按钮供用户操作。

相关推荐
Star(up up up)2 小时前
Redis Windows 安装教程:使用Windows 的 Redis 压缩包
redis·笔记·学习·程序人生·云原生·学习方法·改行学it
乌暮5 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
csdn_aspnet6 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
秋雨梧桐叶落莳8 小时前
【iOS】Block底层详解
macos·ios·cocoa
茶底世界之下9 小时前
舞台灯下的萨克斯:用 Awaking 让铜管从蓝幕前亮起来
ios·app·产品
传奇开心果编程9 小时前
【Flutter踩坑排雷】第28课:平台目录缺失与修复坑|`flutter create` 的“重建”与“覆盖”边界
android·flutter·ios·移动开发·跨平台·dart·声明式ui
3095566669 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
蒸蒸yyyyzwd9 小时前
从邓明学习的后端笔记
笔记·学习
机器学习之心10 小时前
基于变量相关图与残差学习的 GCN 多变量回归方法——混凝土 28 天抗压强度预测
学习·回归·gcn
Rabitebla1 天前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash