swift中的闭包传值(block)

原文地址:http://www.myexception.cn/operating-system/1684429.html
http://www.cocoachina.com/bbs/read.php?tid=230724

原文如下:

 

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

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

一、第一个界面

//  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

扫描二维码关注公众号,回复: 3703498 查看本文章

    }

    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.

    }

    

    

   

    

}


二、第二个界面

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

    }

    

    

   

    

}

猜你喜欢

转载自blog.csdn.net/c_chang/article/details/68065739
今日推荐