码迷,mamicode.com
首页 > 移动开发 > 详细

iOS:视图切换的第一种方式:模态视图

时间:2015-09-10 21:11:07      阅读:2116      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

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连接后通过按钮事件实现切换。

 

  举例:两个视图切换(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控制器中模态出窗口,并正向传递数据

技术分享技术分享

 1 #import "ViewController.h"
 2 #import "SecondViewController.h"
 3 @interface ViewController ()
 4 @property (weak, nonatomic) IBOutlet UITextField *TextField;
 5 
 6 @end
 7 
 8 @implementation ViewController
 9 -(void)setTextWithBackInfo:(NSString *)info
10 {
11     self.TextField.text = info;
12 }
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15 }
16 //纯代码创建模态显示
17 - (IBAction)forwardClicked:(UIButton *)sender
18 {
19     //首先创建模态显示的控制器
20     //从storyboard中加载控制器
21     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
22     
23     //匹配storyboard的标识符
24     SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
25     
26     //正向传数据
27     secondVC.info = self.TextField.text;
28     
29     //显示模态窗口
30     [self presentViewController:secondVC animated:YES completion:nil];
31 }
32 
33 @end

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

技术分享

技术分享

    

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

  主要代码如下:

  FirstViewController控制器中的代码:

1 #import <UIKit/UIKit.h>
2 
3 @interface ViewController : UIViewController
4 
5 -(void)setTextWithBackInfo:(NSString *)info;
6 @end
 1 #import "ViewController.h"
 2 #import "SecondViewController.h"
 3 @interface ViewController ()<SecondViewControllerDelegate>
 4 @property (weak, nonatomic) IBOutlet UITextField *TextField;
 5 
 6 @end
 7 
 8 @implementation ViewController
 9 -(void)setTextWithBackInfo:(NSString *)info
10 {
11     self.TextField.text = info;
12 }
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15 }
16 //纯代码创建模态显示
17 - (IBAction)forwardClicked:(UIButton *)sender
18 {
19     //首先创建模态显示的控制器
20     //从storyboard中加载控制器
21     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
22     
23     //匹配storyboard的标识符
24     SecondViewController *secondVC = [storyboard instantiateViewControllerWithIdentifier:@"Second"];
25     
26     //正向传数据
27     secondVC.info = self.TextField.text;
28     
29     //为了接受反向数据,将自己设置为模态窗口的代理,很好的降低了模态窗口的耦合性
30     secondVC.delegate = self;
31     
32     //显示模态窗口
33     [self presentViewController:secondVC animated:YES completion:nil];
34 }
35 
36 #pragma mark -SecondViewController的代理方法
37 //通过代理接受模态窗口反向传回的数据
38 -(void)SecondVC:(SecondViewController *)vc didFinishedWithInfo:(NSString *)info
39 {
40     self.TextField.text = info;
41 }
42 @end

    SecondViewController控制器中的代码:

 1 #import <UIKit/UIKit.h>
 2 @protocol SecondViewControllerDelegate;
 3 @interface SecondViewController : UIViewController
 4 @property (weak, nonatomic) IBOutlet UILabel *label;
 5 @property (copy,nonatomic)NSString *info;
 6 //2.添加代理属性
 7 @property (weak,nonatomic)id<SecondViewControllerDelegate> delegate;
 8 @end
 9 
10 
11 //1.定义协议
12 @protocol SecondViewControllerDelegate
13 
14 -(void)SecondVC:(SecondViewController*)vc didFinishedWithInfo:(NSString*)info;
15 
16 @end
 1 #import "SecondViewController.h"
 2 
 3 @interface SecondViewController ()
 4 @property (weak, nonatomic) IBOutlet UITextField *textField;
 5 @end
 6 
 7 @implementation SecondViewController
 8 - (IBAction)backButtonClicked:(UIButton *)sender
 9 {
10     //self.presentedViewController  当前控制器模态出的窗口
11     //self.presentingViewController 模态出当前控制器的窗口
12     
13     
14     //3.通过代理反向传数据
15     [self.delegate SecondVC:self didFinishedWithInfo:self.textField.text];
16     
17     
18     //关闭模态窗口
19     [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
20     
21 }
22 
23 - (void)viewDidLoad {
24     [super viewDidLoad];
25     // Do any additional setup after loading the view.
26     
27     self.label.text = self.info;
28 }

 

    最后的演示结果为:

技术分享 技术分享

技术分享 技术分享

iOS:视图切换的第一种方式:模态视图

标签:

原文地址:http://www.cnblogs.com/XYQ-208910/p/4798875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!