2017-10-11 113 views
3

每当Notification到达并且App尝试执行其关联方法时,我都会崩溃并收到unrecognized selector错误。 这里是我的代码 - 这是在viewDidLoadSwift 4 - 通知中心addObserver问题

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错误。

任何想法我做错了什么? (顺便说一句,这与Xcode 8完美配合,但现在Swift 4和Xcode 9的语法已经改变了[Xcode让我通过必要的代码修复/更新] - 但是崩溃仍在继续。)

+0

如果您使用过'#selector',编译器会指出问题 - 'sayHello'必须是'@ objc'。比较https://stackoverflow.com/q/44390378/2976878 – Hamish

+0

使用像这样'#selector(yourVC.yourfunctionName)' – Mannopson

+0

正如@Hamish所提到的,你应该使用'#selector(sayHello)'和你的方法签名也传递通知对象(放下NS前缀)'@objc func sayHello(_ notification:Notification)' –

回答

11

您可以通过以下步骤提高代码:

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解决

+1

你应该放弃NS前缀 –

+0

是的,确切地说,谢谢;) –

+0

名称不是通知的成员 - 问题快到4 –