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
复制代码
目录
相关文章
|
11天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
116 3
|
11天前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
50 3
|
11天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
11天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
45 0
|
11天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
11天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
11天前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
24 2
|
11天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
28 0
|
11天前
|
搜索推荐 iOS开发 开发者
利用SwiftUI构建动态用户界面:iOS开发新篇章
【4月更文挑战第10天】在移动应用的世界中,流畅的用户体验和引人注目的界面设计是至关重要的。随着SwiftUI的推出,iOS开发者被赋予了创造高度动态且响应式界面的能力。本文将深入探讨如何利用SwiftUI的强大特性来实现一个动态用户界面,包括其声明性语法、状态绑定以及视图更新机制。我们将通过一个天气应用案例,了解如何有效地运用这些工具来提升应用的交互性和视觉吸引力。
|
11天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。