次のコードを考えてみましょう。
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
次に、A を実装する UIViewController サブクラスを見てください。
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
しかし驚くべきことに、これはエラーでクラッシュします:
keyboardDidShow:]: 認識されないセレクターがインスタンス 0x7fc97adc3c60 に送信されました
ビューコントローラー自体にオブザーバーを実装する必要がありますか? エクステに残らないの?
以下のことはすでに試しました。
A をクラス プロトコルにします。署名としてプロトコル自体に keyboardDidShow を追加します。
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}