2014-10-14 15 views
20

Sto facendo una sottoclasse UIButton a Swift per eseguire disegno personalizzato e animazione sul selezioneSwift - UIButton prioritario setSelected

Quale sarebbe l'equivalente a Swift di rilevante - (void)setSelected:(BOOL)selected in objC?

ho cercato

override var selected: Bool

così ho potuto implementare un osservatore ma ottengo

Cannot override with a stored property 'selected'

risposta

47

Come altri menzionato è possibile utilizzare willSet per rilevare i cambiamenti. In una sostituzione, tuttavia, non è necessario assegnare il valore a super, si sta solo osservando il cambiamento esistente.

un paio di cose che si possono osservare dalla seguente: parco giochi

  1. Sostituzione di una proprietà per willSet/didSet chiamate ancora super per get/set. Lo si può sapere perché lo stato cambia da .normal a .selected.
  2. willSet e didSet sono chiamati anche quando il valore non sta cambiando, quindi probabilmente si vorrà fare il valore di selected confronto a uno newValue in willSet o oldValue in didSet per determinare se o non animare.
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. 
+2

In ** SWIFT3 ** 'selected' è stato rinominato in "isSelected" ... Si prega di aggiornare :) – Husam

+0

@Husam aggiornato. :) –

0

provare questo

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

Xcode mi avvisa e suggerisce di sostituire il pubblico con interno. Potresti spiegare perché è necessaria la parola chiave interna? Grazie. – LorTush

+0

Usando interno stai dicendo che puoi accedere a var dallo stesso modulo. Hai maggiori informazioni qui: http://www.codingricky.com/access-control-in-swift/ Spero che questo aiuti :) – diegomen

6

lo faresti come ad esempio questo:

class MyButton : UIButton { 

    // ... 

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

    // ... 

} 
+0

Ok questo funziona anche senza la parola chiave public/internal come suggerito da diegomen. Stavo ricevendo l'errore perché non avevo ancora incluso il {} con l'osservatore, sciocco me ... Ma continuo a non capire perché sono obbligatori ... – LorTush

0

Creare IBAction e controllare il pulsante selezionato o meno nel linguaggio veloce.

@IBAction func favoriteButtonAction(sender: UIButton) { 

    // Save Data 
    sender.selected = !sender.selected; 

    if (sender.selected) 
    { 
     NSLog(" Not Selected"); 
    } 
    else 
    { 
     NSLog(" Selected"); 
    } 

}