2014-10-14 12 views
20

Robię podklasę UIButton w Swift wykonać niestandardowy rysowania i animacji na wybórSwift - UIButton nadrzędnym setSelected

co byłoby równoważne Swift z nadrzędnymi - (void)setSelected:(BOOL)selected w ObjC?

Próbowałem

override var selected: Bool

więc mogłem realizować obserwatora, ale pojawia

Cannot override with a stored property 'selected'

Odpowiedz

47

Jak wspomniano powyżej, można użyć willSet do wykrywania zmian. W override jednak nie musisz przypisywać wartości super, tylko obserwujesz istniejącą zmianę.

Kilka rzeczy można obserwować z poniższego zabaw:

  1. przesłanianie właściwość dla willSet/didSet nadal nazywa SUPER get/set. Możesz powiedzieć, ponieważ stan zmienia się z .normal na .selected.
  2. willSet i didSet nazywane są nawet wtedy, gdy wartość nie zmienia się, więc prawdopodobnie będziesz chciał zrobić to porównać wartość selected albo newValue w willSet lub oldValue w didSet w celu ustalenia, czy ma być animowany.
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

W ** SWIFT3 ** "wybrany" został zmieniono nazwę na "isSelected' ... Please update :) – Husam

+0

@Husam Zaktualizowano. :) –

0

spróbować

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

Xcode ostrzega mnie i sugeruje zastąpienie publicznego przez wewnętrzny. Czy mógłbyś wyjaśnić, dlaczego wewnętrzne słowo kluczowe jest konieczne? Dzięki. – LorTush

+0

Używając wewnętrznego mówisz, że możesz uzyskać dostęp do var z tego samego modułu. Więcej informacji znajdziesz tutaj: http://www.codingricky.com/access-control-in-swift/ Nadzieję, że to pomaga :) – diegomen

6

chcesz to zrobić jak np to:

class MyButton : UIButton { 

    // ... 

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

    // ... 

} 
+0

OK to działa nawet bez publicznego/wewnętrznego słowa kluczowego, jak sugeruje diegomen. Otrzymałem błąd, ponieważ nie dołączyłem jeszcze {} z obserwatorem, głupiego mnie ... Ale nadal nie rozumiem, dlaczego są one obowiązkowe ... – LorTush

0

Tworzenie IBAction i sprawdzić, czy nie wybrany przycisk w szybkim języku.