zoukankan      html  css  js  c++  java
  • iOS:视图切换的第一种方式:模态窗口

    一、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控制器中模态出窗口,并正向传递数据

     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 }

        最后的演示结果为:

     

     

  • 相关阅读:
    8. String to Integer (atoi)
    PHP Warning: strftime(): It is not safe to rely on the system's timezone set
    Jackson 使用
    用vim去掉utf-8 BOM
    oracle 11g 从 dmp 文件中导出 sql 代码 的方法.
    git gitosis 添加项目
    Linux gcc和gdb程序调试用法 {转}
    Dos中转义符
    HTML样式链接到外部样式表
    转:财富与智慧
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4798875.html
Copyright © 2011-2022 走看看