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

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

OC中Blocks反向传值和Swift中Closure反向传值的差别,下面直接贴上代码:

一、第一个界面

[objc] view plain copy Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
  1. import UIKit  
  2.   
  3. class ZWRootViewController: UIViewController {  
  4.   
  5.     init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {  
  6.         super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)  
  7.         // Custom initialization  
  8.     }  
  9.     var myLabel:UILabel?  
  10.     override func viewDidLoad() {  
  11.         super.viewDidLoad()  
  12.           
  13.         var item = UIBarButtonItem(title:"下一页",style:UIBarButtonItemStyle.Plain,target:self,action:"nextBtnClicked")  
  14.         self.navigationItem.rightBarButtonItem = item  
  15.           
  16.           
  17.         myLabel = UILabel(frame:CGRectMake(0,100,320,50))  
  18.         myLabel!.text = "Closure"  
  19.         myLabel!.textAlignment = NSTextAlignment.Center  
  20.         self.view.addSubview(myLabel!)  
  21.         // Do any additional setup after loading the view.  
  22.     }  
  23.     func someFunctionThatTakesAClosure(string:String) -> Void {  
  24.         // function body goes here  
  25.         myLabel!.text = string  
  26.     }  
  27.     func nextBtnClicked(){  
  28.         let second = ZWSecondViewController(nibName:nil,bundle:nil)  
  29.         //将当前someFunctionThatTakesAClosure函数指针传到第二个界面,第二个界面的闭包拿到该函数指针后会进行回调该函数  
  30.         second.initWithClosure(someFunctionThatTakesAClosure)  
  31.         self.navigationController.pushViewController(second,animated:true)  
  32.           
  33.     }  
  34.       
  35.     override func viewWillDisappear(animated: Bool){  
  36.         myLabel!.hidden = true  
  37.     }  
  38.     override func viewWillAppear(animated: Bool){  
  39.         myLabel!.hidden = false  
  40.     }  
  41.     override func didReceiveMemoryWarning() {  
  42.         super.didReceiveMemoryWarning()  
  43.         // Dispose of any resources that can be recreated.  
  44.     }  
  45.       
  46.   
  47.     /* 
  48.     // #pragma mark - Navigation 
  49.  
  50.     // In a storyboard-based application, you will often want to do a little preparation before navigation 
  51.     override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 
  52.         // Get the new view controller using [segue destinationViewController]. 
  53.         // Pass the selected object to the new view controller. 
  54.     } 
  55.     */  
  56.   
  57. }  

二、第二个界面

[objc] view plain copy Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
  1. import UIKit  
  2. //类似于OC中的typedef  
  3. typealias sendValueClosure=(string:String)->Void  
  4. class ZWSecondViewController: UIViewController {  
  5.     var i:Int?  
  6.     //声明一个闭包  
  7.     var myClosure:sendValueClosure?  
  8.     //下面这个方法需要传入上个界面的someFunctionThatTakesAClosure函数指针  
  9.     func initWithClosure(closure:sendValueClosure?){  
  10.         //将函数指针赋值给myClosure闭包,该闭包中涵盖了someFunctionThatTakesAClosure函数中的局部变量等的引用  
  11.         myClosure = closure  
  12.     }  
  13.       
  14.     init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {  
  15.         super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)  
  16.           
  17.         // Custom initialization  
  18.     }  
  19.   
  20.     override func viewDidLoad() {  
  21.         super.viewDidLoad()  
  22.         i = 0  
  23.         var btn = UIButton.buttonWithType(UIButtonType.System) as?UIButton  
  24.         btn!.frame = CGRectMake(0,100,320,50)  
  25.         btn!.setTitle("点击我" ,forState:UIControlState.Normal)  
  26.         btn!.addTarget(self,action:"action", forControlEvents:UIControlEvents.TouchUpInside)  
  27.         self.view.addSubview(btn)  
  28.           
  29.         // Do any additional setup after loading the view.  
  30.     }  
  31.     func action(){  
  32.         i = i!+1  
  33.         //判空  
  34.         if myClosure{  
  35.             //闭包隐式调用someFunctionThatTakesAClosure函数:回调。  
  36.             myClosure!(string: "好好哦\(i)")  
  37.         }  
  38.     }  
  39.     override func didReceiveMemoryWarning() {  
  40.         super.didReceiveMemoryWarning()  
  41.         // Dispose of any resources that can be recreated.  
  42.     }  
  43.       
  44.   
  45.     /* 
  46.     // #pragma mark - Navigation 
  47.  
  48.     // In a storyboard-based application, you will often want to do a little preparation before navigation 
  49.     override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 
  50.         // Get the new view controller using [segue destinationViewController]. 
  51.         // Pass the selected object to the new view controller. 
  52.     } 
  53.     */  
  54.   
  55. }