下面介绍Swift的反向传值的两种方法,其实swift的方向传值和OC一样,也可以用通知等方式,这里只介绍两种
一、代理(delegate)传值:
基本步骤可以分6步:
1、代理声明
// 1、代理的声明
protocol LJKCustomDelegate: NSObjectProtocol {
// 代理的方法 item、tag是传的值
func btnClickItem(item: LJKCustomBtn, forTag tag: Int)
}
2、代理定义
// 2、代理定义
var delegate: LJKCustomDelegate?
3、代理方法触发
// 3、 代理的方法触发
delegate?.btnClickItem(item: self, forTag: self.tag)
4、导入代理
// 4、在 DelegateController 这个类中导入代理
class DelegateController: UIViewController , LJKCustomDelegate
5、给对象挂上代理
let btn = LJKCustomBtn (frame: CGRect(x: 20, y: 80, width: 90, height: 30))
btn.tag = 66666
// 5、 挂代理
btn.delegate = self
6、代理方法的实现
// 6、代理方法实现
func btnClickItem(item: LJKCustomBtn, forTag tag: Int) {
print("代理传值ViewTag:\(tag)")
}
PS: 4、5、6步在需要接收值的类中实现
二、Block传值:
1、Block定义
// ①定义block的两种方法
// 1
// public typealias blockSelectView = (_ viewTag: Int) ->Void
// var viewSelectBlock: blockSelectView?
// 2
public var btnClickBlock:((_ viewTag: Int) -> Void)?
2、Block的回调触发
// ②Block 的方法触发
if btnClickBlock != nil {
btnClickBlock?(self.tag)
}
3、Block接收值的回调(在需要接收值的类中实现)
//③、 block反向传值的,接收值
btn.btnClickBlock = {(viewTag) in
print("Block反向传值:\(viewTag)")
}
三、运行结果:
四、文件部分:
1、回调类
//
import UIKit
// 1、代理的声明
protocol LJKCustomDelegate: NSObjectProtocol {
// 代理的方法 item、tag是传的值
func btnClickItem(item: LJKCustomBtn, forTag tag: Int)
}
class LJKCustomBtn: UIButton {
// 2、代理定义
var delegate: LJKCustomDelegate?
// ①定义block的两种方法
// 1
// public typealias blockSelectView = (_ viewTag: Int) ->Void
// var viewSelectBlock: blockSelectView?
// 2
public var btnClickBlock:((_ viewTag: Int) -> Void)?
// 重写父类方法
override init(frame: CGRect) {
super .init(frame: frame)
self.setTitle("反向传值", for: UIControlState.normal)
self.backgroundColor = UIColor.purple
self.addTarget(self, action: #selector(LJKCustomBtn.btnClick), for: UIControlEvents.touchUpInside)
}
// 按钮方法
func btnClick(){
// 3、 代理的方法触发
delegate?.btnClickItem(item: self, forTag: self.tag)
// ②Block 的方法触发
if btnClickBlock != nil {
btnClickBlock?(self.tag)
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
2、接收类:
//
import UIKit
// 4、在 DelegateController 这个类中导入代理
class DelegateController: UIViewController , LJKCustomDelegate{
override func viewDidLoad() {
super.viewDidLoad()
let btn = LJKCustomBtn (frame: CGRect(x: 20, y: 80, width: 90, height: 30))
btn.tag = 66666
// 5、 挂代理
btn.delegate = self
//③、 block反向传值的,接收值
btn.btnClickBlock = {(viewTag) in
print("Block反向传值:\(viewTag)")
}
self.view.addSubview(btn)
}
// 6、代理方法实现
func btnClickItem(item: LJKCustomBtn, forTag tag: Int) {
print("代理传值ViewTag:\(tag)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}