ViewController 的常用跳转及返回方法

news2024/11/26 9:14:35

ViewController 的常用跳转及返回方法

  • ViewController 的常用跳转及返回方法
    • 模态跳转
    • 导航控制器
    • 选项卡控制器
    • Storyboard 的 segues 方式跳转

ViewController 的常用跳转及返回方法

模态跳转

一个普通的视图控制器一般只有模态跳转的功能,这个方法是所有视图控制器对象都可以用的。

切换方法如下:

// 弹出,出现一个新视图,可以带动画效果,完成后可以做相应的执行函数经常为 nil
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
// 退出一个新视图,可以带动画效果,完成后可以做相应的执行函数经常为 nil
- (void)dismissViewControllerAnimated: completion:

利用模态视图进行多个页面跳转后,要返回最初始的页面则需要了解到控制器的两个属性 presentedViewController 和 presentingViewController,它们分别是被 present 的控制器和正在 presenting 的控制器。比如说, 控制器 A 和 B,有:

[A presentViewController:B animated:YES completion:nil];

那么 A 相对于 B 就是 presentingViewController,B 相对于 A 是 presentedViewController,即:

B.presentingViewController = A;
A.presentedViewController = B;

假设利用模态跳转,依次前往 A-B-C-D,最后要从 D 返回到 A,返回过程如下:

- (void)dismissModalStack {
    UIViewController *vc = self.presentingViewController;
    while (vc.presentingViewController) {
    		vc = vc.presentingViewController;
    }
    [vc dismissViewControllerAnimated:YES completion:NULL];
}

需要注意的是,默认他的实现过程是移除跳转之前的控制器的 view,并将新的控制器的 view 展示,但跳转之前的控制器并没有被释放,而是被强引用这的。

导航控制器

UINaviGationController 通常被我们称为导航栏,它是视图与视图之间联系沟通的桥梁。每个控制器对象都有一个 NavigationController 属性,NavigationController 的 view 的是由导航条、导航条控制的 view、和栈顶控制器的 view 组成的。

工作原理:通过栈的方式的来实现,NavigationController 展示永远就是栈顶的控制器的 view。当使用 push 方法的时候,就将需要跳转的控制器压入栈中,成为栈顶控制器;当使用 pop 方法的时候,就将控制器移出栈,原来跳转之前的控制器重新成为栈顶控制器,被展现。

导航控制器涉及到的类有:

  1. UINavigationBar:导航栏,继承至 UIView。导航栏位于屏幕的上方,管理整个 NavigationController 的 navigationItem,即类似 navigationcontroller 一样提供了一个栈来管理 item。
  2. UINavigationItem:继承至 NSObject,可以通过这个属性来设置 title、prompt、leftBarButtonItem、titleView、rightBarButtonItem、backBarButonItem等。
  3. UIBarButtonItem:继承至 UIBarItem,UIBarItem 继承至 UIButton。这是专门用来放在 UIToolbar 或者 UINavigationBar 的特殊按钮。

切换方法如下:

// 跳转到指定的界面
[self.navigationController pushViewController:viewController animated:YES];
// 弹出当前显示的界面,返回到上个界面
[self.navigationController popViewControllerAnimated:YES];
// 返回到根视图控制器
[self.navigationController popToRootViewControllerAnimated:YES]; 
// 弹出到指定视图控制器
UIViewController *viewController = nil;
for (UIViewController *tempVc in self.navigationController.viewControllers) {
    if ([tempVc isKindOfClass:[UIViewController class]]) {
    		viewController = tempVc;
    }
}
[self.navigationController popToViewController:viewController animated:YES];

选项卡控制器

UITabBarController 一般作为 app 的根界面的视图控制器。其实与其说 UITabBarController 的界面跳转,不如说是界面切换,因为 UITabBarController 的界面跳转其实就是 UITabBarController 的 viewControllers 数组中的几个界面切换。只要设置好了 UITabBarController 的 viewControllers 数组就可以了。

TabBar 的结构:

截屏2024-06-19 20.53.31

通过调用 UITabBarController 的 addChildViewController 方法添加子控制器:

UITabBarController *tabbarVC = [[UITabBarController alloc] init];

OneViewController *oneVC = [[OneViewController] init];
oneVC.tabBarItem.title = @"one";
oneVC.tabBarItem.image = [UIImage imageNamed: @"one.png"];

TwoViewController *twoVC = [[TwoViewController] init];
twoVC.tabBarItem.title = @"two";
twoVC.tabBarItem.image = [UIImage imageNamed: @"two.png"];

// 添加子控制器(这些子控制器会自动添加到 UITabBarController 的 viewControllers 数组中)
[tabbarVC addChildViewController:oneVC];
[tabbarVC addChildViewController:twoVC];

Storyboard 的 segues 方式跳转

此方法仅适用于 Storyboard 中各个页面连线后的跳转,Storyboard上每一根用来界面跳转的线,都是一个 UIStoryboardSegue 对象(简称 Segue)。

鼠标点击一个页面,按住 control 键拖拽到另一个页面,在弹出的 segue 页面中选择跳转模式即可,连线完之后选中连线,在 Identifier 填上对应的标示。

  • 如果连线的方式是 push,则 ViewController 需要由 UINavigationController 来管理,返回方式则和 UINavigationController 一样。
  • 如果连线的方式是 model,则 ViewController 不需要由 UINavigationController 来管理,返回方式和模态的返回方式一样。
  • 如果连线的方式是 custom,则需要自定义 segue。
截屏2024-06-19 21.01.43

然后再在需要跳转的地方实现如下代码即可完成跳转:

[self performSegueWithIdentifier:@"test" sender:self];

通过 dismissViewControllerAnimated: 方法可以返回前一个界面。

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

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

相关文章

MySQL高级-索引-使用规则-SQL提示(use、ignore、force)

文章目录 1、查看表 tb_user2、展示索引3、为profession、age、status创建 联合索引4、查询 profession软件工程5、执行计划 profession软件工程6、创建profession单列索引7、再次执行计划 profession软件工程8、SQL提示8.1、use index(idx_user_pro)8.2、ignore index(idx_use…

v-for中key的原理以及用法

在 Vue.js 中,v-for 指令用于基于源数据多次渲染元素或模板块。当使用 v-for 渲染列表时,为每个列表项提供一个唯一的 key 属性是非常重要的。key 的主要作用是帮助 Vue 跟踪每个节点的身份,从而重用和重新排序现有元素。 先来张原理图&#…

Springboot项目实训--day1

目录 一、软件安装 二、软件的简单了解 三、基础知识应用 1、四个常用注释 2、尝试新建类 3、控制反转(IOC容器) 4、返回数据给浏览器 5、浏览器传回数据给服务器 易错点 一、软件安装 需要安装的软件是idea专业版,刚使用的时候可以使…

基于SpringBoot+Vue的论坛网站系统(带1w+文档)

基于SpringBootVue的论坛网站系统(带1w文档) 对于之前论坛网站的管理,大部分都是使用传统的人工方式去管理,这样导致了管理效率低下、出错频率高。而且,时间一长的话,积累下来的数据信息不容易保存,对于查询、更新还有…

如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK

1.先下载需要的字体。 下载字体的网站比较多,基本上都是免费的。随便在网上搜索一个就可以了,下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 ​www.fonts.net.cn/font-31602268591.html 注意:切记不要商用,以免…

昇思25天学习打卡营第10天|基于MindSpore的GPT2文本摘要

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 基于MindSpore的GPT2文本摘要 %%capture captured_output # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall m…

c#学习日志用CLI(命令行窗口)创建c#工程

创建Helloworld.Proj和Program.cs两个文件然后运行即可,一种方法是用记事本创建,写入代码,这种比较费劲,主要代码如下 Program.cs中代码如下 System.Console.WriteLine("Hello World!!"); Helloworld.Proj中的代码如…

【Linux】初识操作系统

一、冯•诺依曼体系结构 在学习操作系统之前,我们先来认识一下冯•诺依曼体系结构,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机&am…

怎么在vite项目中全局导入一个scss文件

怎么在vite项目中全局导入一个scss文件 🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64…

VUE项目安全漏洞扫描和修复

npm audit 1、npm audit是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 2、npm audit名称执行,需要包package.json和package-lock.json文件。它是通过分析 package-lock.json 文件,继而扫描我们的包分析是否包含漏洞的。 …

C++初学者指南-2.输入和输出---从输入流错误中恢复

C初学者指南-2.输入和输出—从输入流错误中恢复 文章目录 C初学者指南-2.输入和输出---从输入流错误中恢复怎么了&#xff1f;解决方案&#xff1a;出错后重置输入流 怎么了&#xff1f; 示例&#xff1a;连续输入 int main () {cout << "i? ";int i 0;cin…

Web服务器与Apache(虚拟主机基于ip、域名和端口号)

一、Web基础 1.HTML概述 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语音,用于创建和组织Web页面的结构和内容&#xff0c;HTML是构建Web页面的基础&#xff0c;定义了页面的结构和内容&#xff0c;通过标记和元素来实现 2.HTML文件结构 <html>…

【Linux进阶】基础IO函数详解

1.函数open和openat 调用open或openat函数可以打开或创建一个文件。 #include <fcntl.h> int open(const char *path, int ofag, ... /* mode_t mode */);int openat (int fd, const char *path, int oflag, ... /* mode_t mode */); 我们将最后一个参数写为...&#x…

Windows下activemq开启jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq开启jmx 1.进入activemq conf目录&#xff0c;备份activemq.xml文件 2.编辑activemq.xml文件&#xff0c;在broker节点增加useJmx"true" <broker xmlns"http://active…

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识&#xff0c;本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点&#xff1a; 第36练&#xff1a;鼠标击中测试1 第37练&#xff1a;鼠标击中测试2—增加键盘接口 第38练&#xff1a;鼠标击中测试3—子窗口 第39练&…

独立付费进群系统

无授权源码 有独立分销代理端 域名防封 可对接码支付 易支付 需要用到回调 源码链接

腾讯实时语音编码大突破 电梯、地库里通话也不卡顿

腾讯宣布&#xff0c;腾讯主导的新一代实时语音编码行业标准AVS3P10&#xff0c;即将正式对外发布。由腾讯会议天籁实验室携手腾讯AI Lab研发的Penguins编解码器&#xff08;即AVS3P10行业标准的原型&#xff09;&#xff0c;把经典信号处理和最新的深度学习技术结合在一起&…

pppd 返回错误码 含义

错误码 00&#xff1a; pppd已经断开&#xff0c;或者已经成功建立连接后请求方又中 断了。 01&#xff1a; 发成了一个严重错误&#xff0c;例如系统调用失败或者访问非法内存。 02&#xff1a; 处理给定操作是检测到错误&#xff0c;例如使用两个互斥的操作。 03&#xff1a;…

测试报告-HTMLTestRunner报告优化(中/英文)

引用原始的HTMLTestRunner.py文件生成的测试报告在美观性不是很好&#xff0c;使用在此文件基础上优化后的HTMLTestReportCN.py文件(生成的报告为中文)、HTMLTestReportEN.py文件(生成的报告为英文)。 1 首先新建一个Python项目 例如&#xff1a;testHtmlReport 创建case包&am…

【JVM】Java虚拟机运行时数据分区介绍

JVM 分区&#xff08;运行时数据区域&#xff09; 文章目录 JVM 分区&#xff08;运行时数据区域&#xff09;前言1. 程序计数器2. Java 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池7. 直接内存 前言 之前在说多线程的时候&#xff0c;提到了JVM虚拟机的分区内存…