我已经将UIButton
子类化了,并且当按钮进入突出显示状态时只想调用一次委托方法,并且当它进入未突出状态时再调用一次:
override var isHighlighted: Bool {
didSet {
if isHighlighted {
delegate?.buttonHighlightStateDidChange(highlighted: true)
} else {
delegate?.buttonHighlightStateDidChange(highlighted: false)
}
}
}
然而,当我触摸按钮时,看起来didSet被反复调用。我在这做错了什么?如何只调用一次委托方法?
答案 0 :(得分:3)
我建议不要以这种方式使用你的子类。 UIControl
有一个内置机制,用于获取回调以响应控件事件:
func registerActions(for button: UIButton) {
button.addTarget(self, action: #selector(MyClass.buttonIsHighlighted(sender:)), for: .touchDown)
button.addTarget(self, action: #selector(MyClass.buttonIsUnHighlighted(sender:)), for: .touchUpInside)
button.addTarget(self, action: #selector(MyClass.buttonIsUnHighlighted(sender:)), for: .touchUpOutside)
}
func buttonIsHighlighted(sender: UIButton) {
// highlighted
}
func buttonIsUnHighlighted(sender: UIButton) {
// unhighlighted
}