Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值

时间:2021-06-29 20:44:45

一、第一个界面

//  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.  }  */ }