我正试图在标签栏控制器之间传递数据,但是它不起作用。 第一控制员:
class FirstViewController: UIViewController {
@IBOutlet weak var sentNotificationLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateNotificationSentLabel:", name: mySpecialNotificationKey, object: nil)
}
@IBAction func notify() {
NSNotificationCenter.defaultCenter().postNotificationName(mySpecialNotificationKey, object: nil, userInfo:["message":"Something"])
}
func updateNotificationSentLabel(notification:NSNotification) {
let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!>
let messageString = userInfo["message"]
sentNotificationLabel.text = messageString
}
}
这里工作正常,sentNotificationLabel.text是“Something”
第二控制器类似,但他没有收到任何通知。
class SecondViewController: UIViewController {
@IBOutlet weak var notificationLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateLabel:", name: mySpecialNotificationKey, object: nil)
}
func updateLabel(notification:NSNotification) {
let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!>
let messageString = userInfo["message"]
notificationLabel.text = messageString
}
}
我做错了什么?怎么改变?
答案 0 :(得分:4)
发生此问题的原因是您在第二个视图控制器注册之前发送消息。
NSNotificationCenter
不支持粘性通知 - 换句话说,邮件不会被缓存。如果在发送通知的那一刻没有人正在收听,它就会消失。
最简单的解决方法是在初始化程序中注册SecondViewController
通知。但是,还没有加载UILabel - 我们在viewDidLoad
回调之前。解决方案是在本地缓存接收的消息,并在准备就绪时使用它来设置标签文本。
class SecondViewController: UIViewController {
@IBOutlet weak var notificationLabel: UILabel!
var cachedMessage : String? = nil
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateLabel:", name: mySpecialNotificationKey, object: nil)
}
override func viewDidLoad() {
if let cachedMessage = cachedMessage {
notificationLabel.text = cachedMessage
}
}
func updateLabel(notification:NSNotification) {
let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!>
let messageString = userInfo["message"]
if let notificationLabel = notificationLabel {
notificationLabel.text = messageString
} else {
cachedMessage = messageString
}
}
}
由于控制器在显示之前已初始化,因此应正确传递消息。
答案 1 :(得分:0)
只需在init方法
中添加观察者required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "addBadge", name: "addBadge", object: nil)
}