您的位置:首页 > 移动开发 > Swift

Swift之delegate代理和Block闭包的反向传值

2017-09-20 22:37 399 查看
下面介绍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()
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息