Consideriamo il seguente codice:Swift protocollo di estensione make un osservatore di notifica
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
Ora guardate una sottoclasse UIViewController che implementa A:
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
Ma sorprendentemente questa si blocca con un errore:
keyboardDidShow:]: unrecognized selector sent to instance 0x7fc97adc3c60
Quindi devo implementare l'osservatore nel controller di visualizzazione stesso? Non può rimanere nell'estensione?
A seguito di cose già provate.
rendendo A un protocollo di classe. Aggiunta di keyboardDidShow al protocollo stesso come firma.
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}
ho provato qualcosa di simile anche in passato, ma ho scoperto che le estensioni del protocollo di Swift non funzionano con i protocolli di Objective-C e classi, [ma apparentemente lo fanno in qualche modo] (http://stackoverflow.com/questions/27097688/can-objective-c-code-call-swift-extension-on-class), sono confuso – Kametrixom
'estensione A { } '??? Stai parlando di 'extension Controller {}' –
Hai solo bisogno di aggiungere il parametro al metodo o delete: dalla fine del nome del selettore –