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

ViewController 的常用跳转及返回方法

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: 方法可以返回前一个界面。

相关文章:

ViewController 的常用跳转及返回方法

ViewController 的常用跳转及返回方法 ViewController 的常用跳转及返回方法模态跳转导航控制器选项卡控制器Storyboard 的 segues 方式跳转 ViewController 的常用跳转及返回方法 模态跳转 一个普通的视图控制器一般只有模态跳转的功能,这个方法是所有视图控制器…...

FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流

《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消…...

探索AI的巅峰:详解GPT-3.5与GPT-4系列模型的区别

人工智能领域不断涌现出令人惊叹的技术突破,其中OpenAI的ChatGPT系列模型尤为引人注目。随着GPT-4的发布,技术开发者们对比分析其与前一代GPT-3.5的差异显得尤为重要。本文将深入探讨GPT-3.5和GPT-4系列模型的主要区别,帮助大家更好地理解和应…...

Linux-笔记 使用SCP命令传输文件报错 :IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

前言 使用scp命令向开发板传输文件发生报错&#xff0c;报错见下图; 解决 rm -rf /home/<用户名>/.ssh/known_hosts 此方法同样适用于使用ssh命令连接开发板报错的情况。 参考 https://blog.csdn.net/westsource/article/details/6636096...

计算机网络 静态路由及动态路由RIP

一、理论知识 1.静态路由 静态路由是由网络管理员手动配置在路由器上的固定路由路径。其优点是简单和对网络拓扑变化不敏感&#xff0c;缺点是维护复杂、易出错&#xff0c;且无法自动适应网络变化。 2.动态路由协议RIP RIP是一种基于距离向量的动态路由协议。它使用跳数作…...

Django实现部门管理功能

在这篇文章中,我们将介绍如何使用Django框架实现一个简单的部门管理功能。这个功能包括部门列表展示、添加新部门、编辑和删除部门等操作。 1. 项目设置 首先,确保你已经安装了Django并创建了一个新的Django项目。在项目中,我们需要创建一个名为​​app01​​的应用。 2.…...

概率论与数理统计期末复习

概率论常考知识点汇总 总括 1. 基础概率论 概率定义&#xff1a;理解概率是事件发生的可能性度量&#xff0c;范围从0&#xff08;不可能&#xff09;到1&#xff08;必然发生&#xff09;。概率公理&#xff1a;掌握概率的三大公理&#xff0c;即非负性、规范性和可加性。条…...

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击

import pyautogui import cv2 import numpy as np import mathdef find_and_click(template_path, target_x, target_y, match_threshold0.8):"""在屏幕上查找目标图片并点击。Args:template_path: 目标图片的路径。target_x: 预设的坐标 x 轴值。target_y: 预设…...

【实战教程】如何使用JMeter来轻松测试WebSocket接口?

1、websocket接口原理 打开网页&#xff1a;从http协议&#xff0c;升级到websocket协议&#xff0c;请求建立websocket连接服务器返回建立成功成功客户端向服务端发送匹配请求服务端选择一个客服上线服务器返回客服id客户端向服务器发送消息服务器推送消息给指定的客服服务器…...

【linux】详解——库

目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 简介&#xff1a;C站最萌博主 相关…...

RuntimeError: “exp_vml_cpu“ not implemented for ‘Half‘

遇到 "exp_vml_cpu" not implemented for Half 这个运行时错误&#xff0c;意味着你尝试在一个操作中使用了半精度&#xff08;Half 或 float16&#xff09;数据类型&#xff0c;但是该操作在当前环境下并没有针对半精度数据类型的实现。 半精度&#xff08;float16&…...

JVM之双亲委派机制

1.双亲委派机制 在Java中&#xff0c;类加载器具有层次结构。每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器&#xff08;parent&#xff09;&#xff0c;可以理解为上级&#xff0c;并不是继承关系。应用程序类加载器的parent父加载器是扩展类加载器&#xff0…...

Gemalto SafeNet Luna HSM服务器硬件监控指标解读

在现代化的信息安全体系中&#xff0c;硬件安全模块&#xff08;HSM&#xff09;扮演着至关重要的角色&#xff0c;它负责保护和管理敏感的数据和密钥。Gemalto SafeNet Luna HSM作为一款高性能的硬件安全模块&#xff0c;广泛应用于金融、政府和企业等领域。为了确保Luna HSM的…...

计算机视觉与人工智能领域常用期刊和会议缩写

在撰写论文时有时候会面临超篇幅的情况&#xff0c;这时候一个常用的操作便是使用期刊&#xff08;会议&#xff09;的缩写或者半缩写来替换期刊&#xff08;会议&#xff09;全称 为了方便自己后续使用相关的缩写 特此整理 如有不当之处 欢迎大家指正~~ 计算机视觉与人工智能…...

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…...

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二&#xff1a;说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多&#xff0c;重要的Exif信息&#xff1a;拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义&#xff0c;如果放到网上还是建议抹去这些信息。…...

使用Python自动化收集和处理视频资源的教程

在这篇教程中&#xff0c;我们将介绍如何利用Python脚本自动化收集和处理视频资源。这篇文章将帮助您掌握基本的网络自动化技术&#xff0c;并使用相关库进行视频资源的获取和保存。以下是具体的实现步骤和代码示例。 环境准备 在开始之前&#xff0c;请确保您的工作环境中已…...

字节数组输出流转换为Base64方法记录

1. 今天在做字节数组转换Base64的时候遇到一个问题&#xff0c;转换成的Base64字符串自动换行&#xff0c;导致传输失败 关键代码&#xff1a; ByteArrayOutputStream out new ByteArrayOutputStream(); ............. BASE64Encoder encoder new BASE64Encoder(); Stri…...

在eclipse中导入idea项目步骤

一、可以把其它项目的.project&#xff0c; .classpath文件拷贝过来&#xff0c;修改相应的地方则可。 1、.project文件只需要修改<name>xxx</name>这个项目名称则可 2、.classpath文件通常不用改&#xff0c; 二、右击 项目名 >选择“Properties”>选择 Re…...

海思SS928/SD3403开发笔记4——u盘挂载

首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图&#xff1a; 取消挂载 umount /mnt/usb...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

ffmpeg(三):处理原始数据命令

FFmpeg 可以直接处理原始音频和视频数据&#xff08;Raw PCM、YUV 等&#xff09;&#xff0c;常见场景包括&#xff1a; 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装&#xff08;如封装为 MP4、TS&#xff09; 处理原始 YUV 视频…...