Problema NotificationCenter en Swift 3

Estoy aprendiendo Swift 3 y estoy tratando de usar NSNotificationCenter . Aquí está mi código:

 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) } 

y este es el observador:

 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 } 

Siempre me da el error “signal SIGBRT”. Cuando trato de cambiar el nombre en el observador, no es un error, pero obviamente no mostró nada. ¿Cómo puedo solucionar esto?

Swift 3 y 4

Swift 3, y ahora Swift 4, han reemplazado muchas API “stringly-typed” con struct “tipos de envoltura”, como es el caso de NotificationCenter. Las notificaciones ahora se identifican mediante una struct Notfication.Name lugar de mediante String . Para obtener más detalles, consulte la guía heredada de Migrating to Swift 3.

Uso de 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) 

Uso de Swift 3 y 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) 

Todos los tipos de notificaciones del sistema ahora se definen como constantes estáticas en Notification.Name ; es decir .UIApplicationDidFinishLaunching , .UITextFieldTextDidChange , etc.

Puede extender Notification.Name con sus propias notificaciones personalizadas para mantenerse coherente con las notificaciones del sistema:

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

Uso de Swift 4.2 :

Igual que Swift 4, excepto que ahora los nombres de las notificaciones del sistema son parte de UIApplication. Por lo tanto, para mantenerse coherente con las notificaciones del sistema, puede extender la aplicación UIApplication con sus propias notificaciones personalizadas en lugar de Notification.Name:

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

Para todos los que luchan con #selector en Swift 3 o Swift 4, aquí un ejemplo de código completo:

 // WE NEED A CLASS THAT SHOULD RECEIVE NOTIFICATIONS 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 a subclass 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)") } } 

En este ejemplo, tratamos de obtener POST de AppDelegate (así que en AppDelegate implementar esto):

 // --------------------------------------------- // 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) } 

Las notificaciones parecen haber cambiado nuevamente (octubre de 2016).

// Registrarse para recibir notificaciones

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

// Publicar notificación

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

Creo que ha cambiado de nuevo.

Para publicar esto funciona en Xcode 8.2.

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