zoukankan      html  css  js  c++  java
  • StoryBoard页面传值,关闭后回调

    转自:http://my.oschina.net/u/874588/blog/101183 (有个别处修改)

    一、storyboard页面切换

    假设view controller1下有一个button1,view controller2下有一个button2,我们要实现storyboard在这两个view controller之间切换。

    1、 Controller1切换Controller2

    在storyboard界面下,点住button1,右键拖动至controller2,松手,选择Modal

    2、Controller2切回Contrller1

    这里要注意不能使用刚刚的方式了,因为刚刚的方式是一个界面“前往”另一个界面,而不是“返回”另一个界面,换句话说,“前往”会新建很多controller,我们应该“返回”,虽然这两者表面上看上去好像差不多

    1)、 cmd+n新建一个UIViewController的subClass,命名为Page2ViewController,不要创建xib,因为它的xib实际上就是view controller2

    2)、选中View Controller2,将它的Custom Class设置为Page2ViewController。其实就是指明一下,这个xib就是给Page2ViewController类调用的。

    如果发现下拉列表中没有Page2ViewController,请确认选择的是View Controller2

    3)、使用拖动的方式在Page2ViewController.h 为按钮创建一个Action:returnToFirstPage

    4)、返回Page2ViewController.m,调用

    dismissViewControllerAnimated:completion:

    方法完成返回动作

    - (IBAction)returnToFirstPage:(id)sender {  

       [self  dismissViewControllerAnimated:YES  completion:^{}];  

    }  

    正常情况下你会看到View Controller2是以出现方式相反的方式关闭的

    二、srotyboard之间传值

    假设view controller1下有一个button1和一个textField1,view controller2下有一个button2和一个textField2,我们要实现摁下button1将textField1的内容传送给textField2,按下button2将textField2的内容传送给textField1。

    首先还是要将textField1和textField2使用拖动的方式在各自的h文件下命名好调用

    1、textField1传送给textField2

    使用segue代理的方式。

    1)、在view controller2的Page2ViewController.h文件下设置一个NSString类型的变数,它的目的是用来接收由页面 1 透过 Storyboard Segue 所传过来的资讯,程式码如下。

    @property (weak, nonatomic) NSString *exchangeString;  

    //别忘了在对应的实作档中加入@synthesize string;  

    2)、设定在view controller2加载的时候即将textField2的text设置为传递过来的exchangeString

    - (void)viewDidLoad

    {

       [superviewDidLoad];

       textField2.text = exchangeString;

    }

    3)、在view controller1的m文件中调用prepareForSegue:sender:方法将值传递给textField2

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

       //将page2设定成Storyboard Segue的目标UIViewController  

       id page2 = segue.destinationViewController;   

       //将值透过Storyboard Segue带给页面2的string变数  

       [page2 setValue:textField1.textforKey:@"exchangeString"];  

    }  

    4)、虽然做到上面这步已经可以正确传递值了,但是如果直接运行,会发现textField1的弹出框一旦弹出就无法关闭。所以还需要执行如下操作:

    在storyboard中选中textField1,使用拖动的方式建立一个Action

    然后将此方法在m文件中实现出来

    - (IBAction)closeTextField:(id)sender {

       [sender resignFirstResponder];

    }

    2、textField2返还传送给textField1

    将会用到代理和协议的方式。

    透过建立一个协定 @protocol 的方式,让其它的採纳此协定的 class 可以实作协定内的函式,我们在页面 2 的 UIViewController class 里设置一个协定,并且在页面 1 的 UIViewController class 里实作协定里的方法,让程式执行到页面 2 时,仍然能够取得页面 1 的实例 Instance,进而使用协定里的方法来设定 textField 2的数值。

    1)、在页面2的Page2ViewController.h文件下设定协议

    //建立一个协定  

    @protocol Page2Delegate  

    //协定中的方法  

    - (void)passValue:(NSString *)value;  

    @end  

    同时在Page2ViewController类的声明里添加一个协议的物件

    @interface Page2ViewController : UIViewController

    - (IBAction)returnToFirstPage:(id)sender;

    @property (weak, nonatomic) IBOutletUITextField *textField2;

    @property (weak, nonatomic) NSString *exchangeString;  

    //宣告一个採用Page2Delegate协定的物件  

    @property (weak, nonatomic) id delegate;   //记得@synthesize

    @end

    2)、设定该协议物件记录值的位置,肯定是在返回第一个View Controller的时候记录咯

    - (IBAction)returnToFirstPage:(id)sender {  

       [selfdismissViewControllerAnimated:YEScompletion:^{}];  

       //呼叫协定中的方法并带入page2textField的数值  

       [delegatepassValue:textField2.text];  

    }  

    3)、在view controller1的m文件中实现协议相关内容

    首先声明调用定义协议的h文件(可以放到h文件中)

    //引用持有Page2Delegate协定的class  

    #import "Page2ViewController.h"  

    然后实现协议约定的方法

    - (void)passValue:(NSString *)value {  

       //设定page1TextField为所取的的数值  

       textField1.text = value;  

    }  

    4)、重点提出的:记得要将代理 delegate 设成自己

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  

       //将page2设定成Storyboard Segue的目标UIViewController  

       id page2 = segue.destinationViewController;     

       //将值透过Storyboard Segue带给页面2的string变数  

       [page2 setValue:textField1.textforKey:@"exchangeString"];  

       //将delegate设成自己(指定自己为代理)  

       [page2 setValue:selfforKey:@"delegate"];  

    }  

    运行前要将textField2也做一个点击Return Key缩小小键盘的设定,方法参照textField1的做法

  • 相关阅读:
    Python的传递引用
    kafka的ACK
    分布式事务
    Java中的锁
    docker笔记
    MySQL数据库优化
    Centos7使用yum命令安装Mysql5.6.X
    ubuntu16.04安装workbench
    ubuntu下IDEA配置tomcat报错Warning the selected directory is not a valid tomcat home
    ubuntu配置JDK
  • 原文地址:https://www.cnblogs.com/cnwhm/p/3615188.html
Copyright © 2011-2022 走看看