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
复制代码
目录
相关文章
|
1月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
189 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
16天前
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
74 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
4月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
62 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
1月前
|
JavaScript 数据安全/隐私保护
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常用工具函数,并且持续不断维护更新中。另外,组件库全量使用 TypeScript,支持自动按需引入和 Tree Shaking 等,能够显著提升开发效率,降低开发成本。
87 5
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
|
11天前
|
开发框架 缓存 自然语言处理
HarmonyOS ArkTS声明式UI开发实战教程
本文深入探讨了ArkTS作为HarmonyOS生态中新一代声明式UI开发框架的优势与应用。首先对比了声明式与命令式开发的区别,展示了ArkTS如何通过直观高效的代码提升可维护性。接着分析了其核心三要素:数据驱动、组件化和状态管理,并通过具体案例解析布局体系、交互组件开发技巧及复杂状态管理方案。最后,通过构建完整TODO应用实战,结合调试优化指南,帮助开发者掌握声明式UI设计精髓,感受ArkTS的独特魅力。文章鼓励读者通过“破坏性实验”建立声明式编程思维,共同推动HarmonyOS生态发展。
58 3
|
23天前
|
Android开发 UED iOS开发
Harmony os next~UI开发与ArkUI框架
鸿蒙OS的UI开发基于ArkUI框架,采用声明式编程,简化开发流程。五大核心组件(Text、Button、List、Grid、Flex)助力高效布局,支持数据绑定与动态更新。事件响应机制灵敏,适合构建交互丰富的应用。实战技巧包括规范命名、样式复用和调试方法。掌握这些,轻松开发鸿蒙应用。下期预告:分布式开发,记得带上烤冷面!
34 0
|
3月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
2958 2
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
3月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
4月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
250 8

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    56
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    45
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    47
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    124
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    29
  • 6
    iOS各个证书生成细节
    43
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    214
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    66
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    86
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    68