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

来源:互联网 发布:powershell 登录linux 编辑:程序博客网 时间:2024/05/16 20:31

利用了大约一个多小时来搞明白OC中Blocks反向传值和Swift中Closure反向传值的差别,下面直接贴上代码:

一、第一个界面

//  Created by 秦志伟 on 14-6-13.import UIKitclass 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中的typedeftypealias sendValueClosure=(string:String)->Voidclass 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.    }    */}

转载请注明!!!,欢迎加入iOS交流群:爱疯、爱Coding:209476515

3 0