Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NotificationCenter issue on Swift 3 [duplicate]

I'm learning Swift 3 and I'm trying to using NSNotificationCenter. Here is my code:

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

and this is the observer:

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 } 

It always gives me the error "signal SIGBRT". When I try to change the name in the observer, it's not an error, but obviously it didn't show anything. How do I fix this?

like image 810
RoccoBerry Avatar asked Jul 05 '16 13:07

RoccoBerry


2 Answers

Swift 3 & 4

Swift 3, and now Swift 4, have replaced many "stringly-typed" APIs with struct "wrapper types", as is the case with NotificationCenter. Notifications are now identified by a struct Notfication.Name rather than by String. For more details see the now legacy Migrating to Swift 3 guide

Swift 2.2 usage:

// 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 usage:

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

All of the system notification types are now defined as static constants on Notification.Name; i.e. .UIApplicationDidFinishLaunching, .UITextFieldTextDidChange, etc.

You can extend Notification.Name with your own custom notifications in order to stay consistent with the system notifications:

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

Swift 4.2 usage:

Same as Swift 4, except now system notifications names are part of UIApplication. So in order to stay consistent with the system notifications you can extend UIApplication with your own custom notifications instead of Notification.Name :

// Definition: UIApplication {     public static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName") }  // Usage: NotificationCenter.default.post(name: UIApplication.yourCustomNotificationName, object: nil) 
like image 86
Jeffrey Fulton Avatar answered Oct 10 '22 15:10

Jeffrey Fulton


Notifications appear to have changed again (October 2016).

// Register to receive notification

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

// Post notification

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "yourNotificationName"), object: nil) 
like image 36
ICL1901 Avatar answered Oct 10 '22 13:10

ICL1901