web-dev-qa-db-ja.com

Swift-setSelectedをオーバーライドするUIButton

SwiftでUIButtonサブクラスを作成して、選択時にカスタム描画とアニメーションを実行します

ObjCで- (void)setSelected:(BOOL)selectedをオーバーライドするSwift)で同等のものは何でしょうか?

私は試した

override var selected: Bool

オブザーバーを実装できましたが、

Cannot override with a stored property 'selected'

24
LorTush

前述のように、willSetを使用して変更を検出できます。ただし、オーバーライドでは、値をsuperに割り当てる必要はなく、既存の変更を監視するだけです。

次の遊び場から観察できるいくつかのこと:

  1. willSet/didSetのプロパティをオーバーライドしても、get/setのsuperが呼び出されます。状態が.normalから.selectedに変わるためわかります。
  2. willSetとdidSetは、値が変更されていない場合でも呼び出されるため、おそらく、selectedの値をnewValuewillSetまたはoldValuedidSetと比較して、アニメーション化するかどうかを判断する必要があります。
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.
58
Brian Nickel

あなたは例えばこの:

class MyButton : UIButton {

    // ...

    override var isSelected: Bool {
        willSet(newValue) {
            super.isSelected = newValue;
            // do your own business here...
        }
    }

    // ...

}
7
holex

これを試して

override public var selected: Bool {
    willSet(selectedValue) {
        self.selected = selectedValue
        // Do whatever you want
    }
}
0
diegomen