web-dev-qa-db-fra.com

Swift - UIButton overriding setSelected

Je crée une sous-classe UIButton dans Swift pour effectuer un dessin et une animation personnalisés sur la sélection

Quel serait l'équivalent dans Swift de surcharger - (void)setSelected:(BOOL)selected dans ObjC?

J'ai essayé

override var selected: Bool

afin que je puisse mettre en œuvre un observateur mais je reçois

Cannot override with a stored property 'selected'

24
LorTush

Comme d'autres l'ont mentionné, vous pouvez utiliser willSet pour détecter les modifications. Dans un remplacement, cependant, vous n'avez pas besoin d'affecter la valeur à super, vous observez simplement le changement existant.

Quelques choses que vous pouvez observer sur le terrain de jeu suivant:

  1. Substitution d'une propriété pour willSet/didSet appelle toujours super pour get/set. Vous pouvez le savoir car l'état change de .normal à .selected.
  2. willSet et didSet sont appelés même lorsque la valeur ne change pas, vous voudrez donc probablement comparer la valeur de selected à newValue dans willSet ou oldValue in didSet pour déterminer s'il faut ou non animer.
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

vous le feriez comme par exemple cette:

class MyButton : UIButton {

    // ...

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

    // ...

}
7
holex

essaye ça

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