iOS Swift 使用closure 反向传值

上传说了正向传值, 那么自然就有反向传值咯, 不过apple并没有为我们封装类似于正向传值那样方便好用的方法, 也是因为方向传值并不是那么常见, 不过我觉得我们仍然还是需要掌握的, Swift中为我们提供了一个很好的特性, 就是闭包(closure), 使用闭包我们能很轻易的实现反向传值, 接下来跟着我一起做吧. go

新建一个Swift iOS 项目

老样子我们先新建一个single view application

参照这个就行了 http://huyaohui.com/2015/05/28/resignFirstResponder-close-keyboard/

新建一个ViewController

我们需要两个ViewController才能演示回传嘛, 对不, 一个的话不就是自己传给自己那还有什么好说的呢

其实在上次写的那个正向传值的基础上再在nextViewController上加上一个Button就就行了, 这样我们就能出发返回到上一个ViewController了

同样的需要新建一个Swift文件关联这个ViewController以控制这个ViewController

参考: iOS Swift 跳转传值

编写代码

闭包这个概念其实有点难懂的, 不过照着做就是了, 其实实际的应用场景不是很多的, 了解下就好

Viewcontroller.swift

直接看注释就行了, 就不解释了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import UIKit

class ViewController: UIViewController {

@IBOutlet var changeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

// MARK: 数据回传函数
func someFunctionThatTakesAClosure(labelValue:String) -> Void {
changeLabel.text = labelValue
}

// 跳转监听
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

var vc = segue.destinationViewController as! NextViewController

// 这里把对象的指针传到第二个ViewController中
// 在第二个ViewController中就可以间接控制这个对象了
vc.closure = someFunctionThatTakesAClosure
}

// 返回时监听的方法, modal跳转时需要用到这个方法才能返回的
@IBAction func closed(segue: UIStoryboardSegue) {
println("已经返回了哦")
}

}

NextViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import UIKit

// 定义一个闭包类型
// 与上一个ViewController传过来的指针的类型需要保持一致
typealias SendValueClosure = (labelValue:String) -> Void

class NextViewController: UIViewController {

// 定义一个闭包类型的对象用于接收传过来的指针
var closure: SendValueClosure?

override func viewDidLoad() {
super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

@IBAction func clickButton(sender: AnyObject) {

// 在这里调用这个指针函数, 修改上一个对象的属性
// 其实在当前的这个对象内就已经把上一个对象的属性改变了
// 而不是跳转过去之后才发生的改变
// 这点很重要
closure!(labelValue: "数据回传咯")
}
}

modal跳转返回

当modal方式跳转的时候, 我们需要在你要返回的ViewController中定义一个返回的方法, 这样才能进行返回, 否则是无法返回的

然后再通过拉线拖到Exit上, 选择我们写的那个closed方法关上就行了

代码地址

MakeHui/SwiftBaseCodes

总结

还是那句话场景并不是很多, 我所用到的也就只是反向传值而已, 其实也是比较简单的, 总共都 没有几行代码. 总的来说大概明白是怎么回事就好了