这个问题在这里已有答案:
我试图使用 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” . 当我尝试在观察者中更改名称时,这不是错误,但显然它没有显示任何内容 . 我该如何解决?
4 回答
斯威夫特3&4
Swift 3,现在是Swift 4,已经用
struct
"wrapper types"替换了许多"stringly-typed" API,就像NotificationCenter一样 . 通知现在由struct Notfication.Name
而不是String
标识 . 有关详细信息,请参阅现在的遗产Migrating to Swift 3 guideSwift 2.2 用法:
Swift 3 & 4 用法:
现在,所有系统通知类型都定义为
Notification.Name
上的静态常量;即.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
等您可以使用自己的自定义通知扩展
Notification.Name
,以便与系统通知保持一致:Swift 4.2 用法:
与Swift 4相同,但现在系统通知名称是UIApplication的一部分 . 因此,为了与系统通知保持一致,您可以使用自己的自定义通知而不是Notification.Name扩展
UIApplication
:对于所有在Swift 3或Swift 4中使用#selector的人来说,这是一个完整的代码示例:
在这个例子中,我们尝试从AppDelegate获取POST(所以在AppDelegate中实现这个):
通知似乎再次发生变化(2016年10月) .
//注册接收通知
//发布通知
我认为它已经改变了 .
对于发布,这适用于Xcode 8.2 .