Rozważmy następujący kod:Swift rozszerzenie protokołu dokonać obserwator Powiadomienie
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
Spójrzmy teraz na podklasy UIViewController, który implementuje:
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
Ale zaskakująco to wywala się z błędem:
keyboardDidShow:]: unrecognized selector sent to instance 0x7fc97adc3c60
Czy powinienem zatem wdrożyć obserwatora w kontroler widoku? Czy nie może pozostać w rozszerzeniu?
Następujące rzeczy już wypróbowane.
Tworzenie protokołu klasy. Dodawanie keyboardDidShow do samego protokołu jako podpisu.
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}
próbowałam coś podobnego też w przeszłości, ale okazało się, że rozszerzenia protokołu Swifta nie działają z protokołami Objective-C i klasy, [ale najwyraźniej jakoś to robią] (http://stackoverflow.com/questions/27097688/can-objective-c-code-call-swift-extension-on-class), jestem zdezorientowany – Kametrixom
'extension A { } '??? Czy mówisz o 'rozszerzeniu Controller {}' –
Po prostu musisz dodać parametr do metody lub usunąć: od końca nazwy selektora o nazwie –