在iOS开发过程中,我们经常会有这样的一个需求,假设有两个界面:ViewControllerA、ViewControllerB,我们从ViewControllerA进入到ViewControllerB,想把ViewControllerB中的值传回ViewControllerA(反向传值问题),下面介绍闭包和代理两种方法来处理.
这两种方法其实实现的思路是非常类似的,大致分为三个过程:定义、调用、实现.代理传值多一个设置代理的步骤.
闭包传值:
定义:从哪个界面传值,就在哪个界面定义,本案例中是ViewControllerB.
调用:从哪个界面传值,就在哪个界面调用,本案例中是ViewControllerB.
实现:想传递到哪个界面,就在哪个界面实现,本案例中是ViewControllerA.
下面是具体实现代码:
ViewControllerA:
import UIKit
class ViewControllerA: UIViewController{
override func viewDidLoad() {
self.view.backgroundColor = .white
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let viewB = ViewControllerB()
self.present(viewB,animated: true)
//闭包实现
viewB.closure = { age,sentense in
print("\(age)------\(sentense)")
}
}
}
ViewControllerB:
import UIKit
class ViewControllerB :UIViewController{
//闭包定义
var closure:((Int,String)->())?
override func viewDidLoad() {
self.view.backgroundColor = .brown
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//闭包调用
closure!(1314,"Hyx Love Hxy")
self.dismiss(animated: true)
}
}
代理传值:
ViewControllerA:
import UIKit
class ViewControllerB :UIViewController{
//代理定义
var delegate:Transmit?
override func viewDidLoad() {
self.view.backgroundColor = .brown
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//代理调用
delegate?.transmitData(year: 1314, sentense: "Hyx Love Hxy")
self.dismiss(animated: true)
}
}
//协议
protocol Transmit{
func transmitData(year:Int,sentense:String)
}
ViewcontrollerB:
import UIKit
class ViewControllerB :UIViewController{
//代理定义
var delegate:Transmit?
override func viewDidLoad() {
self.view.backgroundColor = .brown
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//代理调用
delegate?.transmitData(year: 1314, sentense: "Hyx Love Hxy")
self.dismiss(animated: true)
}
}
//协议
protocol Transmit{
func transmitData(year:Int,sentense:String)
}
以上就是两种实现反向传值的方法,不仅可以用来传值,还可以用来回调一些方法,进行业务逻辑处理和数据处理.