Swift之delegate代理和Block闭包的反向传值
2017-09-20 22:37
399 查看
下面介绍Swift的反向传值的两种方法,其实swift的方向传值和OC一样,也可以用通知等方式,这里只介绍两种
1、代理声明
2、代理定义
3、代理方法触发
4、导入代理
5、给对象挂上代理
6、代理方法的实现
PS: 4、5、6步在需要接收值的类中实现
2、Block的回调触发
3、Block接收值的回调(在需要接收值的类中实现)
//
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、接收类:
一、代理(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()
}
}
相关文章推荐
- swift-delegate(代理)或者block传值
- Swift 使用代理和闭包(closure)反向传值
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- Swift 正向传值以及利用闭包(closure)实现反向传值(七)
- Swift利用闭包反向传值
- swift基础学习传值[属性传值、代理、block代码块、等]
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- Swift中闭包实现OC的block传值
- [ios][swift]使用swift闭包进行viewcontroller反向传值
- Swift 闭包(block)传值
- swift delegate代理和block的使用
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- Swift如何实现代理,block传值
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
- 【swift_4】swift之代理传值(delegate的用法)
- swift页面传值之block(闭包)传值