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

下面介绍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()
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

启程Boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值