zoukankan      html  css  js  c++  java
  • Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值

    一、第一个界面

    //  Created by 秦志伟 on 14-6-13.
    import UIKit
    
    class ZWRootViewController: UIViewController {
    
      init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
      }
      var myLabel:UILabel?
      override func viewDidLoad() {
        super.viewDidLoad()
        
        var item = UIBarButtonItem(title:"下一页",style:UIBarButtonItemStyle.Plain,target:self,action:"nextBtnClicked")
        self.navigationItem.rightBarButtonItem = item
        
        
        myLabel = UILabel(frame:CGRectMake(0,100,320,50))
        myLabel!.text = "Closure"
        myLabel!.textAlignment = NSTextAlignment.Center
        self.view.addSubview(myLabel!)
        // Do any additional setup after loading the view.
      }
      func someFunctionThatTakesAClosure(string:String) -> Void {
        // function body goes here
        myLabel!.text = string
      }
      func nextBtnClicked(){
        let second = ZWSecondViewController(nibName:nil,bundle:nil)
        //将当前someFunctionThatTakesAClosure函数指针传到第二个界面,第二个界面的闭包拿到该函数指针后会进行回调该函数
        second.initWithClosure(someFunctionThatTakesAClosure)
        self.navigationController.pushViewController(second,animated:true)
        
      }
      
      override func viewWillDisappear(animated: Bool){
        myLabel!.hidden = true
      }
      override func viewWillAppear(animated: Bool){
        myLabel!.hidden = false
      }
      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
      }
      
    
      /*
      // #pragma mark - Navigation
    
      // In a storyboard-based application, you will often want to do a little preparation before navigation
      override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
      }
      */
    
    }

    二、第二个界面

    //  Created by 秦志伟 on 14-6-13.
    import UIKit
    //类似于OC中的typedef
    typealias sendValueClosure=(string:String)->Void
    class ZWSecondViewController: UIViewController {
      var i:Int?
      //声明一个闭包
      var myClosure:sendValueClosure?
      //下面这个方法需要传入上个界面的someFunctionThatTakesAClosure函数指针
      func initWithClosure(closure:sendValueClosure?){
        //将函数指针赋值给myClosure闭包,该闭包中涵盖了someFunctionThatTakesAClosure函数中的局部变量等的引用
        myClosure = closure
      }
      
      init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        
        // Custom initialization
      }
    
      override func viewDidLoad() {
        super.viewDidLoad()
        i = 0
        var btn = UIButton.buttonWithType(UIButtonType.System) as?UIButton
        btn!.frame = CGRectMake(0,100,320,50)
        btn!.setTitle("点击我" ,forState:UIControlState.Normal)
        btn!.addTarget(self,action:"action", forControlEvents:UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)
        
        // Do any additional setup after loading the view.
      }
      func action(){
        i = i!+1
        //判空
        if myClosure{
          //闭包隐式调用someFunctionThatTakesAClosure函数:回调。
          myClosure!(string: "好好哦(i)")
        }
      }
      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
      }
      
    
      /*
      // #pragma mark - Navigation
    
      // In a storyboard-based application, you will often want to do a little preparation before navigation
      override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
      }
      */
    
    }
  • 相关阅读:
    SpringBoot入门学习(二)
    SpringBoot入门学习(一)
    eclipse调试程序界面简单介绍使用
    利用URLConnection来发送POST和GET请求
    查看用户所属的组
    linux下创建用户,给用户设置密码,给用户授权
    新linux系统上rz 与sz命令不可用
    pom.xml文件报错:web.xml is missing and <failOnMissingWebXml> is set to true
    MySql采用GROUP_CONCAT合并多条数据显示的方法
    Mysql计算时间差
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4995739.html
Copyright © 2011-2022 走看看