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必要なコードの修正/更新]-しかし、クラッシュは発生し続けます。)
次の手順でコードを改善できます。
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")
}
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