2017-02-07 1 views
0

Ich habe ein Protokoll wieUIButton background Eigenschaft mit Protokoll

protocol ButtonPresentable { 
    var backgroundColor: UIColor { get } 
} 

extension ButtonPresentable { 
    var backgroundColor: UIColor? { 
     return UIColor.red 
    } 

} 

ich einen Knopf benutzerdefinierte Klasse haben (ziehen mit IB), die mein Protokoll implementiert

class MyButton: UIButton, ButtonPresentable { 
} 

Warum dieses Protokoll nicht " override 'native backgroundColor-Eigenschaft?

Ich möchte eine Standardprotokollimplementierung haben, die einen Standardhintergrund für alle Knöpfe setzt. Gibt es eine protokollorientierte Möglichkeit, Standardwerte für alle UIButton-Hintergrundfarben festzulegen?

EDIT: Eigentlich mache ich die

protocol ButtonPresentable { 
    var pBackgroundColor: UIColor { get } 
} 

extension ButtonPresentable { 
    var pBackgroundColor: UIColor? { 
     return UIColor.red 
    } 

    func applyTheme() { 
     self.backgroundColor = pBackgroundColor 
    } 
} 

// In my custom view 
required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    self.applyTheme() 
} 
+0

hinzufügen 'override' Stichwort vor 'var' Deklaration. Hast du das getestet? – Adolfo

+0

@ Adolfo Nein! Hat nicht funktioniert – Ludovic

Antwort

1

1. Warum dieses Protokoll nicht 'überschreiben' nativer background Eigenschaft?

Denn: Extensions can add new functionality to a type, but they cannot override existing functionality.

Schauen Sie sich das Beispiel:

protocol ButtonProtocol { 
    var name: String { get } 
} 

extension ButtonProtocol { 
    var name: String { 
    return "button protocol" 
    } 
} 

class ButtonClass: ButtonProtocol { 
    var name: String = "button class" 
} 

let button = ButtonClass() 
print(button.name) // prints: button class 

2. Gibt es ein Protokoll orientiert Standardwerte für alle UIButton Hintergrundfarben zu setzen?

Und wenn Sie außer Kraft setzen möchten die backgroundColor aller Tasten können Sie dies tun: einmal die Taste mit seinem Rahmen festgelegt ist, können Sie die Hintergrundfarbe außer Kraft setzen:

extension UIButton { 
    open override var frame: CGRect { 
    didSet { 
     self.backgroundColor = .red 
    } 
    } 
} 
+0

Aww ich habe das verpasst! Vielen Dank. Hast du eine Antwort auf meine Frage: Gibt es eine protokollorientierte Möglichkeit, alle UIButton-Hintergrundfarben zu überschreiben? Ich verstehe Ihr Beispiel mit String, aber mit Farben ist es nicht benutzerfreundlich. Ich aktualisiere meine Frage. – Ludovic

+0

Gibt es keine andere Möglichkeit, die Klassenerweiterung? – Ludovic

+1

Aus den Apple-Dokumenten extrahiert (Link in der Antwort): 'Erweiterungen können neue Convenience-Initialisierer zu einer Klasse hinzufügen, aber sie können keiner Klasse neue Initialisierer oder Deinitialisierer hinzufügen. Gekennzeichnete Initialisierer und Deinitializers müssen immer durch die ursprüngliche Klassenimplementierung zur Verfügung gestellt werden. – Wilson

Verwandte Themen