【iOS】界面推出的方法

【iOS】界面推出的方法

在学习过程中我们发现在iOS中有两种界面推出的方法:push 和 present这两种方法都可以用来推出一个新的界面

但是这两者是存在区别的

  • push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中,可以跨级返回,push是由UINavigationController管理的视图控制器堆栈,在window下同时只能显示一个ViewController。 push一般用于同一业务不同界面间的切换。
  • present 方法是通过模态展示的方式推出新的视图控制器,present是由UIViewController管理的视图控制器堆栈,在window下可以以叠加的方式展示,当顶层的view透明时可以看到底层的view,但只有顶层的view可用户交互,而且只能逐级返回。present一般用于不同业务界面的切换

这里要注意的问题主要是pushpop结合使用,下面给出一下一些常用的方式。

push 和 pop结合使用

self.window.frame = [UIScreen mainScreen].bounds;VCRoot* vc = [[VCRoot alloc] init];//创建导航控制器,用于管理多个视图控制器的切换//采用层级的方式来管理多个视图的一个切换//创建的时候一定要有一个根视图控制器UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:vc];//设置一个根视图//弹回根视图[self.navigationController popToRootViewControllerAnimated:YES];VCThird* vc = [[VCThird alloc] init];//将一个视图控制器推入导航控制器管控的视图控制器堆栈[self.navigationController pushViewController:vc animated:YES];[self.navigationController popViewControllerAnimated: YES];//返回上一级

上面是我们的基本上需要使用的函数,下面我们来应用一下这个部分的内容:

在使用之前我们先要设置我们的一个导航控制器的根视图:

#import "VCRoot.h"
#import "VCSecond.h"
@interface VCRoot ()@end@implementation VCRoot- (void)viewDidLoad {[super viewDidLoad];//设置透明度,yes透明,no不透明self.navigationController.navigationBar.translucent = YES;self.title = @"title";self.navigationItem.title = @"根视图";self.view.backgroundColor = [UIColor blueColor];//设置导航栏的风格默认为Defaultself.navigationController.navigationBar.barStyle = UIBarStyleDefault;UIBarButtonItem* next = [[UIBarButtonItem alloc] initWithTitle:@"下一级别" style:UIBarButtonItemStylePlain target:self action:@selector(pressRight)];self.navigationItem.rightBarButtonItem = next;// Do any additional setup after loading the view.
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/
- (void) pressleft {NSLog(@"left");
}
- (void) pressRight {VCSecond* vcSecond = [[VCSecond alloc] init];//使用这个视图控制器[self.navigationController pushViewController:vcSecond animated:YES];
}
@end

然后设置这个视图控制器为根视图控制器:

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {self.window.frame = [UIScreen mainScreen].bounds;VCRoot* root = [[VCRoot alloc] init];UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:root];self.window.rootViewController = nav;[self.window makeKeyAndVisible];// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
}

我们在设置两个视图控制器:

#import "VCSecond.h"
#import "VCThird.h"
@interface VCSecond ()@end@implementation VCSecond- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor greenColor];UIBarButtonItem* btnNext = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain target:self action:@selector(press)];self.navigationItem.rightBarButtonItem = btnNext;// Do any additional setup after loading the view.
}
- (void)press {VCThird* vc = [[VCThird alloc] init];[self.navigationController pushViewController:vc animated:YES];
}
#import "VCThird.h"@interface VCThird ()@end@implementation VCThird- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor redColor];UIBarButtonItem* btnleft = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(press)];self.navigationItem.rightBarButtonItem = btnleft;// Do any additional setup after loading the view.
}
-(void) press {//弹出上一级界面[self.navigationController popToRootViewControllerAnimated:YES];
}

这样就可以实现一个根视图控制器推出其他视图的效果。

实现效果:

在这里插入图片描述

present 和 dismiss结合使用

我们这里基本上是通过这种方式来推出视图控制器和消失视图控制器。

[self presentViewController:vc animated:YES completion: nil];//这里推出我们的view页面。
[self dismissViewControllerAnimated:YES completion: nil];//消失这个view

下面来使用一下这段代码来呈现一下我们的视图:

- (void)creatUIRectButton { //创建普通的UIButtonUIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];//根据类型来创建UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn1.frame = CGRectMake(10, 400, 120, 80);[btn1 setTitle:@"test button" forState:UIControlStateNormal];[btn1 setTitle:@"按下时候" forState:UIControlStateHighlighted];[btn1 addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];//手指离开时在按钮范围内[btn1 setTintColor:[UIColor whiteColor]];btn1.backgroundColor = [UIColor grayColor];btn.frame = CGRectMake(10, 100, 150, 80);//一个矩型设置的一个位置[btn setTitle:@"button1" forState: UIControlStateNormal]; //一个是按钮的位置,一个是按钮文字的现显示的状态[btn setTitle:@"fitst button1" forState: UIControlStateHighlighted];btn.backgroundColor = [UIColor grayColor];[btn setTitleColor:[UIColor redColor] forState: UIControlStateNormal];[btn setTitleColor:[UIColor greenColor] forState: UIControlStateHighlighted];[btn setTintColor: [UIColor whiteColor]];btn.titleLabel.font = [UIFont systemFontOfSize:18];[btn addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];btn.tag = 101;btn1.tag = 102;[self.view addSubview: btn1];[self.view addSubview: btn]; //添加到视图中显示
}
- (void) press:(UIButton*) btn {if (btn.tag == 102) {View02* vc = [[View02 alloc] init];[self presentViewController:vc animated:YES completion: nil];}if (btn.tag == 101) {NSLog(@"btn1被按下");}
}

这部分代码是通过设置一个按钮来实现一个推出按钮的效果。

这时候我们设置另一个视图控制器的内容,设置他只要点击一下就回退到上一层的内容。

#import "View02.h"@interface View02 ()@end@implementation View02- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor orangeColor];// Do any additional setup after loading the view.
}
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {//使当前的控制器消失掉//P1:新的视图对象//P2:使用动画切换效果//P3:切换结束后功能调用,不需要就传入一个nil。[self dismissViewControllerAnimated:YES completion: nil];
}
/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

这是一个实现效果:

在这里插入图片描述

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

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

相关文章

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数&#xff0c;当一个异步请求需要依赖上一个异步请求返回的结果的时候&#xff0c;就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义&#xff1a;RabbitMQ是一个消息中间件&#xff0c;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

【Python】在【数据挖掘】与【机器学习】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…

基于小波的多元信号降噪-基于马氏距离和EDF统计(MATLAB R2018a)

马氏距离是度量学习中一种常用的距离指标&#xff0c;通常被用作评定数据样本间的相似度&#xff0c;可以应对高维线性分布数据中各维度间非独立同分布的问题&#xff0c;计算方法如下。 &#xff08;1&#xff09;计算样本向量的平均值。 &#xff08;2&#xff09;计算样本向…

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器&#xff0c;它包含了运行协程的资源&#xff0c;如果线程想运行协程&#xff0c;必须先获取P&#xff0c;P中还包含了可运行的G…

零基础直接上手java跨平台桌面程序,使用javafx(二)可视化开发Scene Builder

我们只做实用的东西&#xff0c;不学习任何理论&#xff0c;如果你想学习理论&#xff0c;请去买几大本书&#xff0c;慢慢学去。 NetBeans有可视化工具&#xff0c;但是IntelliJ IDEA对于javafx,默认是没有可视化工具的。习惯用vs的朋友觉得&#xff0c;写界面还要是有一个布局…

永久免费的iPhone,iPad,Mac,iWatch锁屏,桌面壁纸样机生成器NO.105

使用这个壁纸样机生成器&#xff0c;生成iPhone&#xff0c;iPad&#xff0c;Mac&#xff0c;iWatch锁屏&#xff0c;桌面壁纸&#xff0c;展示你的壁纸作品&#xff0c;一眼就看出壁纸好不好看&#xff0c;适不适合 资源来源于网络&#xff0c;免费分享仅供学习和测试使用&am…

归并排序的递归与非递归实现

递归实现 归并排序有点类似于二叉树的后序遍历&#xff0c;是一种基于分治思想的排序算法。具体过程如下&#xff1a; 但要注意&#xff0c;在归并时要额外开辟一个与原数组同等大小的空间用来存储每次归并排序后的值&#xff0c;然后再拷贝到原数组中。 代码实现&#xff1a…

【十大排序算法】归并排序

归并排序&#xff0c;如同秋日落叶&#xff0c;分散而细碎&#xff0c; 然而风吹叶动&#xff0c;自然而有序&#xff0c; 彼此相遇&#xff0c;轻轻合拢&#xff0c; 最终成就&#xff0c;秩序之谧。 文章目录 一、归并排序二、发展历史三、处理流程四、算法实现五、算法特性…

树莓派4B_OpenCv学习笔记5:读取窗口鼠标状态坐标_TrackBar滑动条控件的使用

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习:读取窗口鼠标状态坐标_TrackBar滑动条控件的使…

redis 05 复制 ,哨兵

01.redis的复制功能&#xff0c;使用命令slaveof 2. 2.1 2.2 3. 3.1 3.1.1 3.1.2 3.1.3 4 4.1 4.2 例子 5.1 这里是从客户端发出的指令 5.2 套接字就是socket 这里是和redis事件相关的知识 5.3 ping一下

idea编码问题:需要 <标识符> 非法的类型 、需要为 class、interface 或 enum 问题解决

目录 问题现象 问题解决 问题现象 今天在idea 使用中遇到的一个编码的问题就是&#xff0c;出现了这个&#xff1a; Error:(357, 28) java: /home/luya...........anageService.java:357: 需要 <标识符> Error:(357, 41) java: /home/luya............anageService.ja…

Cinema 4D 2024 软件安装教程、附安装包下载

Cinema 4D 2024 Cinema 4D&#xff08;C4D&#xff09;是一款由Maxon开发的三维建模、动画和渲染软件&#xff0c;广泛用于电影制作、广告、游戏开发、视觉效果等领域。Cinema 4D允许用户创建复杂的三维模型&#xff0c;包括角色、场景、物体等。它提供了多种建模工具&#x…

Channels无法使用ASGI问题

Django Channels是一个基于Django的扩展, 用于处理WebSockets, 长轮询和触发器事件等实时应用程序. 它允许Django处理异步请求, 并提供了与其他WebSockets库集成的功能.当我们在Django Channels中使用ASGI_APPLICATION设置时, 我们可以指定一个新的ASGI应用程序来处理ASGI请求.…

数据库期末设计——图书管理系统

目录 1.前置软件以及开发环境&#xff1a; 2.开发过程讲解 代码环节&#xff1a; 数据库代码 1.BookDao.java 2.BookTypeDao.java 3.UserDao.java 4.Book.java 5.BookType.java 6.User.java 7.DbUtil.java 8.Stringutil.java 9.BookAddInterFrm.java 10.BookMan…