在UILabel上添加闭包操作



我想在用户点击UILabel:时添加一个闭包

class ActionLabel: UILabel {
typealias DidTapLabel = (ActionLabel) -> ()
private let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTouchUpInside(sender:)))
var didTouchUpInside: DidTapLabel? {
didSet {
if didTouchUpInside != nil {
self.addGestureRecognizer(tapGestureRecognizer)
self.isUserInteractionEnabled = true
} else {
self.removeGestureRecognizer(tapGestureRecognizer)
self.isUserInteractionEnabled = false
}
}
}
// MARK: - Actions
@objc func didTouchUpInside(sender: ActionLabel) {
if let handler = didTouchUpInside {
handler(self)
}
}
}

用法:

label.didTouchUpInside = { [weak self] sender in
guard let strongSelf = self else {return}
print(strongSelf)
}

但似乎不起作用

您无法使用对self的引用来初始化手势识别器,因为此时初始化尚未完成。打印手势识别器阵列显示target未设置的信息

addGestureRecognizer(tapGestureRecognizer)
print("(gestureRecognizers)")

输出(看线路末端)

Optional([<UITapGestureRecognizer: 0x6000001f9600; state = Possible; view = <asdfefe.ActionLabel 0x7fd714a03ea0>; target= <(action=didTouchUpInside:, target=<(null) 0x0>)>>])

因此,为了解决这个问题,您可以在初始化调用中初始化手势识别器

private var tapGestureRecognizer:UITapGestureRecognizer!
override init(frame: CGRect) {
super.init(frame: frame)
tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTouchUpInside))
}

希望能有所帮助:)

您的代码不起作用的原因是:

private let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(touchAction))

startget:self是点,当ActionLabel初始化时,它将首先加载您的本地Variable或Constant,因此您将获得一个空目标,因为self现在没有初始化,当您点击视图时,它不会调用触摸操作。

好的解决方案是:

var didTouchUpInside: DidTapLabel? {
didSet {
if didTouchUpInside != nil {
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(touchAction)))
self.isUserInteractionEnabled = true
} else {
if let tapGestureRecognizer = self.gestureRecognizers?[0] as? UITapGestureRecognizer {
self.removeGestureRecognizer(tapGestureRecognizer)
}
self.isUserInteractionEnabled = false
}
}
}

最新更新