一、UIModalController:模态窗口(一个控制器模态出另一个控制器的模态窗口)

  当我们在view controller A中模态显示view controller B的时候,A就充当presenting view controller(弹出VC),而B就是presented view controller(被弹出VC)。官方文档建议这两者之间通过delegate实现交互,在被弹出的VC中定义delegate,然后在弹出VC中实现该代理,这样就可以比较方便的实现两者之间的交互。

模态风格:ModalTransitionStyle

UIModalTransitionStyleCoverVertical = 0,   //垂直变化风格(默认)

UIModalTransitionStyleFlipHorizontal,        //水平旋转风格

UIModalTransitionStyleCrossDissolve,       //闪换风格

UIModalTransitionStylePartialCurl,            //上下翻书风格

1、以模态窗口的形式管理视图,当前视图关闭前其他视图上的内容无法操作。

2、获取不同的模态窗口(主要的属性)

@property(nonatomic,readonly) UIViewController *presentedViewController ;//当前控制器模态出的窗口.

@property(nonatomic,readonly) UIViewController *presentingViewController;//模态出当前控制器的窗口

3、处理模态窗口(主要的方法)

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion);//显示想要显示的模态窗口

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion);//关闭当前显示的模态窗口

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id) //当前控制器模态另一个窗口并传输数据时调用的方法

4、用模态窗口的方式实现视图的切换,即可以在stroybord中通过modal连接的方式将几个UIController连接后去通过按钮事件实现切换,也可以纯代码将storyboard中的几个UIController连接后通过按钮事件实现切换。

5、模态窗口一般采用设置代理或者通知的方式进行反向传输数据。

  设置代理协议或者创建通知中心都是由发送消息者完成的,由接受者设置代理或者注册通知。

  通知方式:

a.有一个(单例)通知中心,负责管理iOS中的所有通知

b.需要获取某种通知,必须注册成为观察者(订阅)

c.不再需要取某种通知时,要取消注册。

d.你可以向通知中心发送某种通知,通知中心会转发给相应的观察者(订阅者)。

NSNotificationCenter *notification = [NSNotificationCenter defaultCenter] //创建通知中心单例对象 

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject //通知中心收到接收者注册的通知  

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;//通知中心帮助发送者发送通知

- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;//接收者接受完数据,通知中心帮助取消注册

6、presentedViewController 可以获取到由当前控制器调用presentModalViewController展示的子视图的控制器。

presentingViewController 则可以获取到展示当前视图的父级(上一级)视图的控制器。

----------------------------------------------------------------------------------------------------------------------------------------------------------

  举例:两个视图切换(FirstViewController、SecondViewController),模态窗口,并输出数据

类关联:

   

 SecondViewController           FirstViewController

  当在storyboard中直接通过modal方式将控制器连接后,需要将storyboard中Segue的属性identifier设置为modal,以便于当前控制器模态出另一个控制器的模态窗口和传输数据。

  第一步:拖出两个视图控制器到storyboard中,并已modal方式连接

  

 第二步:设置storyboard中的segue的属性identifier标识符

 第三步:在FirstViewController控制器中模态出窗口并只进行正向传输数据 

 第四步:在SecondViewController中关闭被模态窗口,并接受数据 

 

  

  当storyboard中的控制器没有通过modal方式直接连接时,可以通过代码来连接,需要将storyboard中要被模态出窗口的控制器的identify的storyboardID设置一个标识。然后,首先创建要被模态显示的控制器,即根据storyboard对象根据标识来加载要被模态窗口的控制器,最后进行模态窗口和传输数据。用这种方式传输数据时,如果是两个以上的控制实现视图切换,由于控制器耦合性太强,会出现错错误,不建议使用。而是通过设置代理来实现数据的传输,即在被模态窗口的控制器中设置协议和代理,在模态窗口的控制器中实现代理的方法即可,大大降低了控制器中间的耦合性。

  《1》切换视图,并不通过代理实现数据正向和反向传输

第一步:拖出两个视图控制器到storyboard中,未连接

第二步:将storyboard中要被模态出窗口的控制器SecondViewController的identify的storyboardID设置一个标识

第三步:在FirstViewController控制器中模态出窗口,并正向传递数据

 #import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *TextField; @end @implementation ViewController
-(void)setTextWithBackInfo:(NSString *)info
{
self.TextField.text = info;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
//纯代码创建模态显示
- (IBAction)forwardClicked:(UIButton *)sender
{
//首先创建模态显示的控制器
//从storyboard中加载控制器
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //匹配storyboard的标识符
SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"]; //正向传数据
secondVC.info = self.TextField.text; //显示模态窗口
[self presentViewController:secondVC animated:YES completion:nil];
} @end

第四步:在SecondViewController中关闭被模态出的窗口,并反向传输数据

    

        《2》切换视图,通过代理实现数据正向和反向传输

  主要代码如下:

  FirstViewController控制器中的代码:

 #import <UIKit/UIKit.h>

 @interface ViewController : UIViewController

 -(void)setTextWithBackInfo:(NSString *)info;
@end
 #import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()<SecondViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *TextField; @end @implementation ViewController
-(void)setTextWithBackInfo:(NSString *)info
{
self.TextField.text = info;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
//纯代码创建模态显示
- (IBAction)forwardClicked:(UIButton *)sender
{
//首先创建模态显示的控制器
//从storyboard中加载控制器
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //匹配storyboard的标识符
SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"]; //正向传数据
secondVC.info = self.TextField.text; //为了接受反向数据,将自己设置为模态窗口的代理,很好的降低了模态窗口的耦合性
secondVC.delegate = self; //显示模态窗口
[self presentViewController:secondVC animated:YES completion:nil];
} #pragma mark -SecondViewController的代理方法
//通过代理接受模态窗口反向传回的数据
-(void)SecondVC:(SecondViewController *)vc didFinishedWithInfo:(NSString *)info
{
self.TextField.text = info;
}
@end

    SecondViewController控制器中的代码:

 #import <UIKit/UIKit.h>
@protocol SecondViewControllerDelegate;
@interface SecondViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (copy,nonatomic)NSString *info;
//2.添加代理属性
@property (weak,nonatomic)id<SecondViewControllerDelegate> delegate;
@end //1.定义协议
@protocol SecondViewControllerDelegate -(void)SecondVC:(SecondViewController*)vc didFinishedWithInfo:(NSString*)info; @end
 #import "SecondViewController.h"

 @interface SecondViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField;
@end @implementation SecondViewController
- (IBAction)backButtonClicked:(UIButton *)sender
{
//self.presentedViewController 当前控制器模态出的窗口
//self.presentingViewController 模态出当前控制器的窗口 //3.通过代理反向传数据
[self.delegate SecondVC:self didFinishedWithInfo:self.textField.text]; //关闭模态窗口
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view. self.label.text = self.info;
}

    最后的演示结果为:

 

 

iOS:视图切换的第一种方式:模态窗口的更多相关文章

  1. iOS:视图切换的第二种方式:UINavigationController导航栏控制器

    UINavigationController:一个以栈的形式管理多视图的容器,负责子控制器之间的跳转.由于以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,所以出栈后的视图会立即销毁. 介绍: & ...

  2. 【原】react做tab切换的几种方式

    最近搞一个pc端的活动,搞了一个多月,甚烦,因为相比于pc端,更喜欢移动端多一点.因为移动端又能搞我的react了. 今天主要总结一下react当中tab切换的几种方式,因为tab切换基本上都会用到. ...

  3. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  4. Unity 人物跟谁手指的移动(第一种方式)

    长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管 ...

  5. 【百度地图API】关于如何进行城市切换的三种方式

    原文:[百度地图API]关于如何进行城市切换的三种方式 摘要:本文介绍了三种切换城市的方式:查询城市.城市列表和显示城市轮廓. ------------------------------------ ...

  6. jQuery Mobile页面跳转切换的几种方式

    jQuery Mobile在移动开发中越来越受到欢迎. 而他的各个版本号也在持续不断的更新中.相同的我也非常喜欢它,它加快了我们开发HTML5的速度. 同一时候又具备jQuery一样的操作方法. 学起 ...

  7. iOS 收起键盘的几种方式

    iOS 收起键盘的几种方式 1.一般的view上收起键盘 // 手势 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ ...

  8. iOS拨打电话的三种方式

    iOS拨打电话的三种方式 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 1 2 var string = "tel:" + "1 ...

  9. iOS 登陆的实现四种方式

    iOS 登陆的实现四种方式 一. 网页加载: http://www.cnblogs.com/tekkaman/archive/2013/02/21/2920218.ht ml [iOS登陆的实现] A ...

随机推荐

  1. Js添加、读取、删除cookie,判断cookie是否有效,指定domain域下主路径path下设置cookie,设置expires过期时间

    有时我们需要用cookie保存用户名,记录登录状态,如何正确判断该机用户cookie是否存在呢?不能简单使用a!=”这样的写法. 正确方法是:判断是否存在名为username3的cookie,使用do ...

  2. Python全栈开发之1、输入输出与流程控制

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

  3. zabbix api 设置维护模式

    通过zabbix提供的api进行维护模式的设置 #!/usr/bin/env python # -*-coding:utf-8-*- import urllib import urllib2 impo ...

  4. Java常用工具类之MD5加密

    package com.wazn.learn.util; import java.security.MessageDigest; /** * MD5加密工具类 * <功能详细描述> * * ...

  5. U2随笔

    Html 结构化 CSS 样式 JavaScript 行为交互 1.JavaScript基础 2.JavaScript操作BOM对象 3.JavaScript操作DOM对象***** 4.JavaSc ...

  6. Linux-数据库1

    数据库介绍 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种 ...

  7. Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质

    Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质 创建部分光滑部分粗糙的材质 生活中,有类物体的表面既有光滑的部分,又有粗糙的部分,例如丽江的石板路,如图3-17所示,石板的表面本来是粗糙的, ...

  8. nyoj 737 石子合并 http://blog.csdn.net/wangdan11111/article/details/45032519

    http://blog.csdn.net/wangdan11111/article/details/45032519 http://acm.nyist.net/JudgeOnline/problem. ...

  9. 【计算几何】【二分图判定】Gym - 101485C - Cleaning Pipes

    题意:有n个水井,每个水井发出一些管线(都是线段),然后每条管线上最多只有一个水井.所有从不同的水井发出的管线的相交点都是清洁点(不存在清洁点是大于两条管线点的交点).你需要在某些管线上放出一些机器人 ...

  10. 【8.31校内测试】【找规律二分】【DP】【背包+spfa】

    打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16.. ...