observer notification example ios swift3 notificationcenter

ios - example - Problema de NotificationCenter en Swift 3



notificationcenter.default.post swift 4 (4)

Swift 3 y 4

Swift 3, y ahora Swift 4, han reemplazado muchas API "de tipo secuencial" con "tipos de envoltura" de struct , como es el caso de NotificationCenter. Las notificaciones ahora se identifican mediante una struct Notfication.Name lugar de String . Para obtener más detalles, consulte la guía heredada Migración a 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 rápido de 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 notificación 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 mantener la coherencia 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 la aplicación UIA. Entonces, para mantener la coherencia 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)

Esta pregunta ya tiene una respuesta aquí:

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 "señal SIGBRT". Cuando trato de cambiar el nombre en el observador, no es un error, pero obviamente no muestra nada. ¿Cómo puedo solucionar esto?


Creo que ha cambiado nuevamente.

Para publicar esto funciona en Xcode 8.2.

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


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

// Regístrese 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)


Para todos los que luchan con el #selector en Swift 3 o Swift 4, aquí hay 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, intentamos obtener POST de AppDelegate (por lo tanto, en AppDelegate implemente 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) }