【iOS】界面推出的方法

news2024/11/15 11:56:48

【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];
    //设置导航栏的风格默认为Default
    self.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 { //创建普通的UIButton
    UIButton *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.coloradmin.cn/o/1809775.html

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

相关文章

BoardLight - hackthebox

简介 靶机名称&#xff1a;BoardLight 难度&#xff1a;简单 靶场地址&#xff1a;https://app.hackthebox.com/machines/603 本地环境 靶机IP &#xff1a;10.10.11.11 ubuntu渗透机IP(ubuntu 22.04)&#xff1a;10.10.16.17 windows渗透机IP&#xff08;windows11&…

springCloudAlibaba之服务熔断组件---sentinel

sentinel组件学习 sentinel学习sentinel容错机制使用代码方式进行QPS流控-流控规则初体验使用SentinelResource注解进行流控 通过代码方式设置降级规则-降级规则初体验sentinel控制台部署客户端整合服务端 springcloud整合sentinelQPS流控规则并发线程数-流控规则BlockExceptio…

wooyun_2015_110216-Elasticsearch-vulfocus

1.原理 ElasticSearch具有备份数据的功能&#xff0c;用户可以传入一个路径&#xff0c;让其将数据备份到该路径下&#xff0c;且文件名和后缀都可控。 所以&#xff0c;如果同文件系统下还跑着其他服务&#xff0c;如Tomcat、PHP等&#xff0c;我们可以利用ElasticSearch的备…

群体优化算法----火山爆发算法介绍以及离散优化Pareto最优解示例

介绍 火山爆发算法&#xff08;Volcano Eruption Algorithm&#xff0c;VEA&#xff09;是一种新兴的群智能优化算法&#xff0c;其灵感来源于火山爆发的自然现象。火山爆发算法模拟了火山爆发过程中熔岩流动和喷发的行为&#xff0c;以寻找全局最优解。这种算法利用了火山爆发…

全网短剧资源

热门短剧资源库&#xff0c;已更新了 9000&#xff0c;记得收藏&#xff1a;https://www.kdocs.cn/l/ciptAICGdWYz

ABB机械人模型下载

可以下载不同格式的 https://new.abb.com/products/robotics/zh/robots/articulated-robots/irb-6700 step的打开各部件是分开的&#xff0c;没有装配在一起&#xff0c;打开看单个零件时&#xff0c;我们会发现其各零件是有装配的定位关系的。 新建一个装配环境&#xff0c;点…

武忠祥17堂课没必要全听,这几个才是精华!

作者&#xff1a;Captain 链接&#xff1a;https://www.zhihu.com/question/381665751/answer/3197724055 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 17堂课类似于习题课&#xff0c;是专题训练 17堂课省略了…

基于AI大文本模型的智慧对话开发设计及C#源码实现,实现智能文本改写与智慧对话

文章目录 1.AI 大模型发展现状2.基于AI服务的智慧对话开发2.1 大模型API选择2.2 基于C#的聊天界面开发2.3 星火大模型API接入2.4 优化开发界面与显示逻辑 3.源码工程Demo及相关软件下载参考文献 1.AI 大模型发展现状 端午假期几天&#xff0c;关注到国内的AI大模型厂商近乎疯狂…

6.7.29 基于卷积神经网络的乳腺良恶性图像分类

计算机化乳腺癌诊断系统在早期癌症诊断中发挥着重要作用。为此&#xff0c;应用深度学习&#xff0c;利用卷积神经网络 (CNN) 对基于小型乳房 X 线图像分析协会 (mini-MIAS) 数据库的乳房 X 线图像中的异常&#xff08;良性或恶性&#xff09;进行分类。观察准确度、灵敏度和特…

java之基础2笔记

1 类型转换 1.1 自动类型转换&#xff08;隐式类型转换&#xff09; 从小的数据类型到大的数据类型的转换&#xff08;如 int 到 long&#xff09;。 从低精度的数据类型到高精度的数据类型的转换&#xff08;如 float 到 double&#xff09;。 1.2 强制类型转换&#xff0…

逆序队专题

逆序对的定义是&#xff0c;在一个数组中&#xff0c;对于下标 ( i ) 和 ( j )&#xff08;其中 ( i < j )&#xff09;&#xff0c;如果 ( a[i] > a[j] )&#xff0c;则称 ((a[i], a[j])) 为数组的一个逆序对。 换句话说&#xff0c;逆序对就是在数组中前面的元素大于后…

每日十题---三

1. Vue中$nextTick原理 1. 简单的理解就是它就是一个setTimeout函数&#xff0c;将函数放到异步后去处理。 2. Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化&#xff0c;Vue 将开启一个队列&#xff0c;并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被…

【计算机毕业设计】273基于微信小程序的刷题系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

AI日报0610 -- Prompt这样改,AI成本瞬降20%!

全球首届人工智能选美大赛 世界 AI 创作者大赛和创作者平台 FanVue 正在举办首届“Miss AI”大赛 超过 1,500 名 AI 生成的模特竞逐。这些模型不仅形象逼真 还展示了不同的个性和原因。 评委将评估技术和吸引观众的能力。 奖金池高达 20,000 美元&#xff0c;并有机会参加公关…

讨论C++类与对象

讨论C类与对象 C语言结构体和C类的对比类的实例化类对象的大小猜想一猜想二针对上述猜想的实践 this指针不同对象调用成员函数 类的6个默认成员函数构造函数析构函数拷贝构造函数浅拷贝和深拷贝 赋值运算符重载 初始化列表初始化顺序 C语言结构体和C类的对比 在C语言中&#x…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

Vision-LSTM: xLSTM 作为通用视觉主干

摘要 尽管Transformer最初是为自然语言处理引入的&#xff0c;但它现在已经被广泛用作计算机视觉中的通用主干结构。最近&#xff0c;长短期记忆&#xff08;LSTM&#xff09;已被扩展为一种可扩展且性能优越的架构——xLSTM&#xff0c;它通过指数门控和可并行化的矩阵内存结…

用函数指针求a和b中的大者

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数&#xff0c;然后通过该指针变量调用此函数。 先按一般方法编写程序&#xff1a; 可以用一个指针变量指向max函数&#xff0c;然后通过该指…

不能访问huggingface、与GPU配置

不能访问huggingface解决方法 如果是从 huggingface.co 下载模型&#xff0c;由于国内不能访问&#xff0c;所以建议先配置一下环境变量&#xff0c; 通过访问国内镜像站点 https://hf-mirror.com来下载模型。 &#xff08;1&#xff09;Linux系统设置环境变量&#xff1a; e…

STM32引脚外部中断和外部事件模式的区别

STM32引脚外部中断和外部事件模式的区别 STM32引脚模式外部中断和外部事件模式的区别&#xff1a; (以 GPIO_MODE_IT_FALLING 和 GPIO_MODE_EVT_FALLING 为例) GPIO_MODE_IT_FALLING 能够触发中断&#xff0c;用在中断方式编程。GPIO_MODE_EVT_FALLING 只设置中断标志位&…