利用了大约一个多小时来搞明确OC中Blocks反向传值和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.

}

*/

}

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

查看原文