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í:
- NSNotificationCenter addObserver en Swift 13 respuestas
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)
}