iOS开发UI篇—Modal简单介绍

简介:

一、简单介绍

除了push之外,还有另外一种控制器的切换方式,那就是Modal

任何控制器都能通过Modal的形式展⽰出来

Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为⽌

二、代码说明

新建一个项目,在Application的代理中添加window和控制器。

YYAppDelegate.m文件

复制代码
 1 //  2 // YYAppDelegate.m
 3 // 01-modal
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYAppDelegate.h" 10 #import "YYViewController.h" 11 12 @implementation YYAppDelegate
13 14 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
15 {
16 //1.创建window,并设置window的frame 17 self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
18 //2.设置window的背景颜色为黑色 19 self.window.backgroundColor=[UIColor blackColor];
20 21 22 //创建一个导航控制器作为子控制器 23 YYViewController *one=[[YYViewController alloc]init];
24 self.window.rootViewController=one;
25 26 //3.设置window为主窗口,并显示 27  [self.window makeKeyAndVisible];
28 return YES;
29 }
30 31 32 @end
复制代码

打开modal窗口

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 01-modal
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYtwoViewController.h" 11 12 @interface YYViewController ()
13 //当点击的时候,跳转到第二个界面 14 - (IBAction)jump2two:(UIButton *)sender;
15 16 @end 17 18 @implementation YYViewController
19 20 - (void)viewDidLoad
21 {
22  [super viewDidLoad];
23 // Do any additional setup after loading the view from its nib. 24 }
25 26 27 - (IBAction)jump2two:(UIButton *)sender {
28 //创建一个新的modal并弹出 29 YYtwoViewController *two=[[YYtwoViewController alloc]init];
30 //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮 31 UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two
32  ];
33 [self presentViewController:nvc animated:YES completion:^{
34 NSLog(@"弹出一个模态窗口");
35  }];
36 37 }
38 @end
复制代码

移除modal视图

YYtwoViewController.m文件

复制代码
 1 //  2 // YYtwoViewController.m
 3 // 01-modal
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtwoViewController.h" 10 11 @interface YYtwoViewController ()
12 13 @end 14 15 @implementation YYtwoViewController
16 17 - (void)viewDidLoad
18 {
19  [super viewDidLoad];
20 21 //给导航条添加一个返回按钮 22 self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(change)];
23 }
24 25 -(void)change
26 {
27 //编写点击返回按钮的点击事件
28 //点击返回按钮,移除当前模态窗口
29 // [self.navigationController dismissViewControllerAnimated:YES completion:^{
30 // NSLog(@"移除模态窗口");
31 // }];
32 33 // 如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让让控制器消失 34 [self dismissViewControllerAnimated:YES completion:^{
35 NSLog(@"移除");
36  }];
37 }
38 39 @end
复制代码

三、注意点

(1)modal的特点:当modal窗口弹出(从下往上)的时候,后面的视图不可点

(2)弹出控制器的视图(通过这种方式只能弹出一个视图)

复制代码
 //创建一个新的modal并弹出
 YYtwoViewController *two=[[YYtwoViewController alloc]init];
 //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮
 UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two
 ];
 [self presentViewController:nvc animated:YES completion:^{
 NSLog(@"弹出一个模态窗口");
 }];
复制代码

(3)移除控制器的视图(两种方式都可以)

复制代码
 //编写点击返回按钮的点击事件
 //点击返回按钮,移除当前模态窗口
// [self.navigationController dismissViewControllerAnimated:YES completion:^{
// NSLog(@"移除模态窗口");
// }];
 
// 如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让让控制器消失
 [self dismissViewControllerAnimated:YES completion:^{
 NSLog(@"移除");
 }];
复制代码

(4)提示在实际的开发中,如果控制器之间的关系紧密一般用导航控制器,如果控制器之间的关系不是很紧密就用modal

四、内部机制

(1)弹出之后,window上面只有一个子视图。

(2)虽然当前界面上展示在我们眼前的时twoview,但是window的根控制器仍然是NJviewController,它并没有切换window的根控制器,而仅仅只是换了window上面显示的视图。

(3)移除的视图并没有销毁,因为控制器并没有销毁,所以控制器对应的view也没有销毁。

(4)在模态弹出(完全显示后),在方法中传入two作为参数,默认就有一个控制器强引用着它。

(5)当向下移除之后,只要调用了控制器的dismiss方法让窗口关闭,modal就释放了。

(6)通常弹出的模态窗口都会提供一个导航条,让界面拥有导航条的最快的方式是给它包装一个导航控制器。

(7)如果一个控制器是以模态的形式展现出来的。可以调用该控制器以及该控制器的子控制器,让该控制器消失。

五、数据的传递

项目文件结构和storyboard

代码示例:

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 02-模态窗口的数据传递
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYtwoViewController.h" 11 12 @interface YYViewController ()
13 14 @end 15 16 @implementation YYViewController
17 18 - (void)viewDidLoad
19 {
20  [super viewDidLoad];
21 }
22 23 - (void)didReceiveMemoryWarning
24 {
25  [super didReceiveMemoryWarning];
26 }
27 28 29 /* 30  如果控制器之间的关系比较紧密一般用 UINavigationController
31  如果控制器之间的关系不是很紧密可以用Modal
32 */ 33 34 //通过segue跳转前,会调用这个方法,在这个方法中把数据传递给弹出来的模态窗口 35 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
36 {
37 //拿到目标控制器 38 UINavigationController *nav=segue.destinationViewController;
39 YYtwoViewController *two=(YYtwoViewController *)nav.topViewController;
40 //传递数据 41 two.name=@"文顶顶";
42 }
43 @end
复制代码

YYtwoViewController.h文件

复制代码
 1 //  2 // YYtwoViewController.h
 3 // 02-模态窗口的数据传递
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 11 @interface YYtwoViewController : UIViewController
12 @property(nonatomic,copy)NSString *name;
13 @end
复制代码

YYtwoViewController.m文件

复制代码
 1 //  2 // YYtwoViewController.m
 3 // 02-模态窗口的数据传递
 4 //  5 // Created by apple on 14-6-9.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtwoViewController.h" 10 11 @interface YYtwoViewController ()
12 @property (weak, nonatomic) IBOutlet UILabel *nametext;
13 14 @end 15 16 @implementation YYtwoViewController
17 18 19 - (void)viewDidLoad
20 {
21  [super viewDidLoad];
22 self.nametext.text=self.name;
23 24 //为导航栏添加一个返回按钮 25 self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(black)];
26 }
27 28 -(void)black
29 {
30 //移除模态窗口 31 [self dismissViewControllerAnimated:YES completion:^{
32 NSLog(@"成功移除!");
33  }];
34 }
35 @end
复制代码
目录
相关文章
|
4月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
160 15
|
4月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
150 11
|
10天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
93 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
3月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
174 56
|
3月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
204 55
|
4月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
151 14
|
3月前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
94 1
|
5月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
167 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
|
6月前
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
1180 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
6月前
|
开发框架 缓存 自然语言处理
HarmonyOS ArkTS声明式UI开发实战教程
本文深入探讨了ArkTS作为HarmonyOS生态中新一代声明式UI开发框架的优势与应用。首先对比了声明式与命令式开发的区别,展示了ArkTS如何通过直观高效的代码提升可维护性。接着分析了其核心三要素:数据驱动、组件化和状态管理,并通过具体案例解析布局体系、交互组件开发技巧及复杂状态管理方案。最后,通过构建完整TODO应用实战,结合调试优化指南,帮助开发者掌握声明式UI设计精髓,感受ArkTS的独特魅力。文章鼓励读者通过“破坏性实验”建立声明式编程思维,共同推动HarmonyOS生态发展。
296 3

热门文章

最新文章