我在Swift中制作了一个UIButton子类,以在选择时执行自定义绘图和动画

在Swift中覆盖ObjC中的- (void)setSelected:(BOOL)selected相当于什么?

我试过了
override var selected: Bool
所以我可以实现一个观察者,但是我得到了
Cannot override with a stored property 'selected'

最佳答案

像其他提到的一样,您可以使用willSet来检测更改。但是,在替代中,您不需要将值分配给super,而只是观察现有的更改。

您可以从以下游乐场观察到几件事:

  • 覆盖willSet/didSet的属性仍会为get/set调用super。您可以知道,因为状态从.normal变为.selected
  • 即使值不变,也会调用
  • willSet和didSet,因此您可能需要将selected的值与newValue中的willSetoldValue中的didSet进行比较,以确定是否进行动画处理。

  • import UIKit
    
    class MyButton : UIButton {
    
        override var isSelected: Bool {
            willSet {
                print("changing from \(isSelected) to \(newValue)")
            }
    
            didSet {
                print("changed from \(oldValue) to \(isSelected)")
            }
        }
    }
    
    let button = MyButton()
    
    button.state == .normal
    button.isSelected = true // Both events fire on change.
    button.state == .selected
    button.isSelected = true // Both events still fire.
    

    关于ios - Swift-覆盖setSelected的UIButton,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26364869/

    10-13 04:03