ViewController 的常用跳转及返回方法

StoryBoard初探(一):实现简单的页面跳转与返回 前言 苹果推出故事版很久了,一直没有深入学习过。最近打算尝试用StoryBoard做高保真交互App原型,决定学习下。相对于IB来讲,StoryBoard几乎不用手写代码,便能实现页面交互,这一点很适合会Xcode的同学用来做快速原型开发。 实现简单的页面跳转 新建工程,选择Single View Application,Xcode生成的工程模板中会自动使用StoryBoard.打开 阅读详情

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 的结构:

请添加图片描述

通过调用 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。

请添加图片描述

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

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

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

如何简单的实现UINavigationViewController侧滑返回上一页功能 立即下载

相关推荐

viewBack:自定义UIViewController隐藏顶部返回按钮文字,自定义标题返回按钮,支持系统滑动手势

viewBack:自定义UIViewController隐藏顶部返回按钮文字,自定义标题返回按钮,支持系统滑动手势

ViewController页面跳转的方法

ViewController页面跳转的方法(一) func clickBtn(){ //跳转到第二个界面             self.secondCtrl = SecondViewController()     self.view.addSubview(self.secondCtrl!.view)          } func clickBtn

a736220388的博客 1146

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 408

多次presentViewController后,直接返回到初始的viewcontroller

3个viewcontroller: A, B, C [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] C直接返回到A:[c.presentingViewController.presentingViewController dismissViewControl

Wondgirl的极客世界 1891

Kali Linux实战:5种局域网DoS攻击手法全解析(附防御方案)

本文以Kali Linux为平台,深入解析了局域网内五种典型的DoS攻击手法,包括TCP SYN Flood、ICMP Flood、MAC地址泛洪、DHCP耗尽以及应用层CC攻击模拟。通过实战演示结合Wireshark抓包分析,清晰揭示了攻击原理与流量特征,并提供了从主机加固、防火墙规则到交换机安全配置(如端口安全、DHCP Snooping)等企业级防御方案,旨在帮助安全人员构建纵深防御体系。

weixin_29313423的博客 396

从安装到跑通第一个例程:Halcon 20.11深度学习版环境搭建全记录

本文详细记录了Halcon 20.11深度学习版环境搭建的全过程,从安装配置到运行第一个例程,特别针对CUDA版本冲突、算子验证和样本数据预处理等常见问题提供解决方案。通过实战案例展示PCB缺陷分类流程,帮助工程师快速掌握工业级图像处理技术,提升深度学习模型在工业质检中的应用效率。

weixin_28739079的博客 220

ViewController跳转的两种方式

模态跳转 使用present可以以模态方式显示ViewController,当ViewControllerA以模式方式显示ViewControllerB后,ViewControllerA的presentedViewController属性会设置为ViewControllerB,ViewControllerB的presentingViewController属性会设置为ViewControllerA...

天道酬勤 1083

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

当检测到TCP/UDP混合攻击时,应触发预设的熔断策略:优先保障游戏大厅服务的UDP 27015端口,临时限制匹配系统的TCP连接数。针对Steam游戏服务器特有的UDP 4380端口,需配置协议合规性检查规则:限制数据包长度不超过128字节,强制校验请求来源IP的真实性。Steam游戏服务器的防护需要平衡安全性与玩家体验,通过协议深度解析、智能流量调度和服务端加固的三维防御体系,可构建游戏行业专属的抗DDoS护城河。答:采用弹性防护方案,基础防护带宽保持50Gbps,遭遇攻击时自动扩展至T级清洗能力。

2501_91486804的博客 1452

返回代码

[self.navigationController popViewControllerAnimated:YES];

weixin_34007879的博客 208

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 259

TCP/IP工业通信C#极致实现:工业级TcpClient封装 + 粘包拆包彻底解决 + 高频采集专项优化(完整可投产)

在工业自动化、PLC通信、工业传感器/模块、产线高频数据采集等场景中,TCP/IP是绝对主流的通信方式,相比串口/485,具备传输速率高、距离无限制、布线简单、抗干扰强的优势。但工业TCP通信和普通桌面TCP通信有本质区别,工业场景的核心要求是:✔高可靠:7×24小时不间断运行,断网自动重连、异常自动恢复,绝不崩溃;✔无数据错误:彻底解决「粘包、拆包、半包」问题(工业通信第一大坑,90%的通信异常源于此);✔高频采集优化:支持级别的高频读写PLC/设备,无卡顿、无丢帧、CPU占用极低;✔。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 859

如何判断UIViewController是使用pop,dismiss返回到上级视图控制器

当我们自定义继承UIViewController视图控制器的基类视图控制器时,会新增返回到上级的视图控制器方法,于是就要区分,返回时使用 pop 的方法,还是使用dismiss 的方法了。 方法1 - (void)backPreviousController { if (self.presentingViewController) { [self dismis

番薯大佬的专栏 1万+

高通开发系列 - Bootloader之lk匹配dtb和dtbo中msm-id和board-id的知识

lk匹配dtb和dtbo中的msm-id和board-id等知识

fulinux的博客 4244

storyboard新增、跳转和关闭ViewController页面

步骤1 在storyboard画板中新增一个ViewController页面 如图 1.点击加号,添加控件 2.在搜索框搜索viewcontroller 3.点击View Controller拖至storyboard画板内 此时storyboard画板新增ViewController页面 步骤2 在项目中新增ViewControoler类 项目中新增Cocoa Touch Class类SecondViewController 步骤3 将上述步骤中新建的SecondViewContr..

简单记录 1920

Harness Engineering:让Coding Agent真正落地生产

本文将带你系统性地了解如何让Coding Agent真正落地生产,核心是依托(全球领先的持续交付、云成本管理、 feature flagging、安全治理一体化平台),结合企业级AIDD(AI-Driven Development)的工程化实践,构建一套可信赖、可观测、可扩展、可治理的Coding Agent落地体系。核心概念与理论基础:什么是Coding Agent?它和普通的AI代码补全工具(比如GitHub Copilot)有什么区别?什么是Harness Engineering?

移动开发前沿的博客 454

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

iOS开发之ViewController页面跳转和弹出模态

本文介绍了iOS开发中ViewController的页面跳转和弹出模态,ViewController是MVC开发模式中一个重要的类。   ViewController 页面跳转 从一个Controller跳转到另一个Controller时,一般有以下2种:  1、利用UINavigationController,调用pushViewController,进行跳转;这种采用压栈和出栈

执迷的博客 1664

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SplitViewController只能做根视图,如何从一个ViewController跳转到SplitViewController

根据官方文档,UISplitViewController只能作为rootViewController,不能通过segue实现跳转,也不能在navigationController导航状态下push,replace,只能popover。(同时masterViewController的宽度也不能修改)现在要实现从一个viewController跳转到splitViewController,例如先出现一

ChangeC的专栏 3611

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于RXSwift 下 页面跳转进行解耦 非ViewController类实现页面跳转

在日常开发过程中我们为了使这个项目,页面精简 美观易懂,往往采用组件式开发,会对一个复杂的完整页面分割成一个个UI view ,UItableviewcell 等控件类,或者我们会在某些网络请求回调 和异步操作跳转页面。如何在这些类内进行页面跳转呢。 class NavigatorService : BaseService{ static let publishSubject = P...

qq_40023759的博客 973

iOS ViewController跳转界面的几种方法简单总结

1、模态跳转(Modal) 模态:一个普通的视图控制器一般只有模态跳转的功能,这个方法是所有视图控制器对象都可以用的。 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion 在官方文档中,建议这两者之间通过delegate实现交互。例如使用UIImagePickerController.

az44yao的专栏 1218

iOS开发中ViewController的页面跳转和弹出模态

ViewController 页面跳转 从一个Controller跳转到另一个Controller时,一般有以下2种:  1、利用UINavigationController,调用pushViewController,进行跳转;这种采用压栈和出栈的方式,进行Controller的管理。调用popViewControllerAnimated方法可以返回。  复制代码代码如下:

Keep_Moving31038的博客 2577

ios开发中viewcontroller之间的跳转

最近遇到这样一个问题,有A B  C三个viewcontroller,A跳转到B,B跳转到C,返回的时候希望直接从C跳回A,关闭B; 解决思路: 在这里我们不能使用push/pop,popViewControllerAnimated是逐个一层层后退的,如果在跳转到C的时候用popToRootViewControllerAnimated这个将A置顶,则从C后退的时候会报错; 所以,可以

JJMM2009的专栏 5567

iOS多级跳转,返回指定viewcontroller

在开发中经常会有多级跳转 viewcontroller的问题,然后有时不一定要一级一级的返回,可能直接返回到某个根视图控制器或某个指定的控制器.其中采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一级页面跳转到了二级页面,然后从二级页面跳转到了三级页面,依次类推。,如果一级一级的返回我知道是没有问题的,调用navigat

一路向北去买半岛铁盒的 3821

IOS ViewController跳转大全

学习之路很长 但是很有收获 坚持

watertekhqx的博客 1200

iOS 移除上一个push跳转的ViewController

前言: 虽然项目中用的不多,但是有时候要用,就像订单之前的页面需要移除等等,而且代码老忘,网上有记录,但是不多,找起来可麻烦,所以再次记录一下。 案例: push跳转,跳转到下一个页面后,移除当前页面,点击返回,返回到当前的上一级页面。 使用方法: 最好是push 之后直接使用,方便省事。 上代码: Objective-C NSMutableArray *array = self.navigationController.viewControllers.mutableCopy; [array removeO

优快云博客 3148

iOS实现点击Back返回按钮跨过多个ViewController跳到指定的ViewController

iOS里有UINavigationViewController通过栈来管理UIViewController,如果你使用segue来指定UIViewController之间的跳转,那么系统默认点击NavigationBar的返回按钮会回到上一个在栈里的UIViewController,也就是执行了栈的pop操作。 那么问题来了,假如我的storyboard是这样的,ViewController A -> ViewController B -> ViewController C。在C里面点击了Ba

黑化肥发挥会挥发 633
上一篇: dispatch_after
下一篇: dispatch_async 详解
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值