web-dev-qa-db-ja.com

Swift 4-通知センターのaddObserverの問題

Notificationが到着し、アプリがその関連メソッドを実行しようとするたびに、クラッシュして_unrecognized selector_エラーが発生します。これが私のコードです-viewDidLoadにあります:

_let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: Selector(("sayHello")), name:NSNotification.Name(rawValue: "dataDownloadCompleted"), object: nil)
_

sayHello()メソッドは非常に単純です-次のようになります。

_func sayHello() {
    print("Hello")
}
_

Notificationが正常にポストされ、それが到着成功したことを確認しました。したがって、それは問題ではありません。 Notificationの到着時にアプリがsayHello()メソッドを実行することで動作しようとすると、クラッシュが発生します。 _unrecognized selector_エラーが発生し続けます。

私が間違っていることは何ですか? (ところで、これはSwift 3&Xcode 8で完全に機能しましたが、今ではSwift 4およびXcode 9で構文が変更されました[Xcode必要なコードの修正/更新]-しかし、クラッシュは発生し続けます。)

11
Sirab33

次の手順でコードを改善できます。

extension Notification.Name {
    static let dataDownloadCompleted = Notification.Name(
       rawValue: "dataDownloadCompleted")
}

そして、次のように使用します:

let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self,
                               selector: #selector(YourClass.sayHello),
                               name: .dataDownloadCompleted,
                               object: nil)

しかし、すでに指摘したように、問題は#selectorに変更することで解決します

Data Receiving - Add observer:

override func viewDidLoad() {
     super.viewDidLoad()
     NotificationCenter.default.addObserver(self, selector: #selector(yourfunction(notfication:)), name: .postNotifi, object: nil)
}

@objc func yourfunction(notfication: NSNotification) {
     print("xxx")
}

Sending Data - Post Notification:

override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
      NotificationCenter.default.removeObserver(self, name: .postNotifi, object: nil)
}

extension Notification.Name {
      static let postNotifi = Notification.Name("postNotifi")
}
7
Giang

Swift 4.0&Xcode 9.0 +:

送信(投稿)通知:

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil)

OR

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil, userInfo: ["Renish":"Dadhaniya"])

受信(取得)通知:

NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)

受信した通知の関数メソッドハンドラー:


@objc func methodOfReceivedNotification(notification: Notification) {}

Swift 3.0&Xcode 8.0 +:

送信(投稿)通知:


NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil)

受信(取得)通知:


NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)

受信した通知のメソッドハンドラー:

func methodOfReceivedNotification(notification: Notification) {
  // Take Action on Notification
}

通知を削除:

deinit {
  NotificationCenter.default.removeObserver(self, name: Notification.Name("NotificationIdentifier"), object: nil)
}

Swift 2.3&Xcode 7:

送信(投稿)通知

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

受信(取得)通知


NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name:"NotificationIdentifier", object: nil)

受信した通知のメソッドハンドラー

func methodOfReceivedNotification(notification: NSNotification){
  // Take Action on Notification
}

参照: https://medium.com/@javedmultani16/notification-in-Swift-4-8b0db631f49d

0