2014-10-14 4 views
20

Ich mache eine UIButton Unterklasse in Swift um benutzerdefinierte Zeichnen und Animation auf Auswahl ausführenSwift - UIButton überwiegendes setSelected

Was das Äquivalent in Swift wäre - (void)setSelected:(BOOL)selected in ObjC vorran?

versuchte ich

override var selected: Bool

so konnte ich einen Beobachter zu implementieren, aber ich

Cannot override with a stored property 'selected'

Antwort

47

Wie andere erwähnt können Sie willSet verwenden, um Änderungen zu erkennen. Bei einer Überschreibung müssen Sie den Wert jedoch nicht super zuweisen. Sie beobachten lediglich die vorhandene Änderung.

Ein paar Dinge, die Sie aus der folgenden Spielplatz beobachten können:

  1. eine Eigenschaft für willSet/didSet Aufschalten nennt noch Super für get/set. Sie können erkennen, dass sich der Status von .normal zu .selected ändert.
  2. willSet und didSet sind aufgerufen, selbst wenn der Wert nicht verändert, so dass Sie wahrscheinlich den Wert von selected entweder newValue in willSet oder oldValue in didSet zu bestimmen, die vergleichen, tun wollen, ob oder nicht zu animieren.
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' wurde umbenannt in 'isSelected' ... Bitte updaten :) – Husam

+0

@Husam Aktualisiert. :) –

0

versuchen diese

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

Xcode gibt mir eine Warnung und schlägt vor, die Öffentlichkeit durch interne zu ersetzen. Könnten Sie bitte erklären, warum das interne Schlüsselwort notwendig ist? Vielen Dank. – LorTush

+0

Mit internen Sie sagen, dass Sie auf die Var aus dem gleichen Modul zugreifen können. Du hast mehr Infos hier: http://www.codingricky.com/access-control-in-swift/ Hoffe es hilft :) – diegomen

6

Sie es wie zum Beispiel tun würde dies:

class MyButton : UIButton { 

    // ... 

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

    // ... 

} 
+0

Ok das klappt auch ohne das public/internal keyword wie von diegomen vorgeschlagen. Ich bekam den Fehler, weil ich das {} mit dem Beobachter noch nicht eingeschlossen hatte, dumme mich ... Aber ich verstehe immer noch nicht, warum sie obligatorisch sind ... – LorTush

0

IBAction erstellen und überprüfen Taste ausgewählt oder nicht in schnellen Sprache.

@IBAction func favoriteButtonAction(sender: UIButton) { 

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

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

}