NotifyCenter问题在Swift 3上

我正在学习Swift 3,并试图使用NSNotificationCenter 。 这是我的代码:

 func savePost(){ let postData = NSKeyedArchiver.archivedData(withRootObject: _loadedpost) UserDefaults.standard().object(forKey: KEY_POST) } func loadPost(){ if let postData = UserDefaults.standard().object(forKey: KEY_POST) as? NSData{ if let postArray = NSKeyedUnarchiver.unarchiveObject(with: postData as Data) as? [Post]{ _loadedpost = postArray } } //codeerror NotificationCenter.default().post(NSNotification(name: "loadedPost" as NSNotification.Name, object: nil) as Notification) } 

这是观察者:

 override func viewDidLoad() { super.viewDidLoad() //codeerorr NotificationCenter.default().addObserver(self, selector: Selector(("onPostLoaded")), name: "loadedPost", object: nil) } func numberOfSections(in tableView: UITableView) -> Int { return 1 } 

它总是给我错误“信号SIGBRT”。 当我尝试在观察者中改变名字时,这不是一个错误,但显然它没有显示任何东西。 我该如何解决?

Swift 3&4

Swift 3,现在Swift 4已经用struct “包装types”replace了许多“stringly-typed”API,就像NotificationCenter一样。 通知现在由一个struct Notfication.Name而不是String标识。 欲了解更多详情,请参阅现在传统的迁移到Swift 3指南

Swift 2.2用法:

 // Define identifier let notificationIdentifier: String = "NotificationIdentifier" // Register to receive notification NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name: notificationIdentifier, object: nil) // Post a notification NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil) 

Swift 3&4用法:

 // Define identifier let notificationName = Notification.Name("NotificationIdentifier") // Register to receive notification NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification), name: notificationName, object: nil) // Post notification NotificationCenter.default.post(name: notificationName, object: nil) // Stop listening notification NotificationCenter.default.removeObserver(self, name: notificationName, object: nil) 

现在,所有的系统通知types都被定义为Notification.Name上的静态常量; 即.UIApplicationDidFinishLaunching.UITextFieldTextDidChange等。

您可以使用自己的自定义通知来扩展Notification.Name ,以便与系统通知保持一致:

 // Definition: extension Notification.Name { static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName") } // Usage: NotificationCenter.default.post(name: .yourCustomNotificationName, object: nil) 

对于所有在SWIFT 3中使用#selector的人来说,这里是一个完整的代码示例:

 // WE NEED A RECEIVING CLASS class MyReceivingClass { // ---------------------------------------------------------------------------------------- // INIT -> GOOD PLACE FOR REGISTERING // ---------------------------------------------------------------------------------------- init() { // WE REGISTER FOR SYSTEM NOTIFICATION (APP WILL RESIGN ACTIVE) // Register without parameter NotificationCenter.default.addObserver(self, selector: #selector(MyReceivingClass.handleNotification), name: .UIApplicationWillResignActive, object: nil) // Register WITH parameter NotificationCenter.default.addObserver(self, selector: #selector(MyReceivingClass.handle(withNotification:)), name: .UIApplicationWillResignActive, object: nil) } // ---------------------------------------------------------------------------------------- // DE-INIT -> LAST OPTION FOR RE-REGISTERING // ---------------------------------------------------------------------------------------- deinit { NotificationCenter.default.removeObserver(self) } // Either "MyReceivingClass" must be subclassed of NSObject OR selector-methods MUST BE signed with '@objc' // ---------------------------------------------------------------------------------------- // HANDLE NOTIFICATION WITHOUT PARAMETER // ---------------------------------------------------------------------------------------- @objc func handleNotification() { print("RECEIVED ANY NOTIFICATION") } // ---------------------------------------------------------------------------------------- // HANDLE NOTIFICATION WITH PARAMETER // ---------------------------------------------------------------------------------------- @objc func handle(withNotification notification : NSNotification) { print("RECEIVED SPECIFIC NOTIFICATION: \(notification)") } } 

在这个例子中,我们尝试从AppDelegate获取POST(所以在AppDelegate中实现这个):

 // ---------------------------------------------------------------------------------------- // WHEN APP IS GOING TO BE INACTIVE // ---------------------------------------------------------------------------------------- func applicationWillResignActive(_ application: UIApplication) { print("POSTING") // Define identifiyer let notificationName = Notification.Name.UIApplicationWillResignActive // Post notification NotificationCenter.default.post(name: notificationName, object: nil) } 

通知似乎再次发生了变化(2016年10月)。

//注册接收通知

 NotificationCenter.default.addObserver(self, selector: #selector(yourClass.yourMethod), name: NSNotification.Name(rawValue: "yourNotificatioName"), object: nil) 

//发布通知

 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "yourNotificationName"), object: nil) 

我认为它已经改变了。

用于在Xcode 8.2中发布这些作品。

 NotificationCenter.default.post(Notification(name:.UIApplicationWillResignActive) 
Interesting Posts