使用Swift中的NSNotificationCenter在Tab Bar控制器之间传递数据

时间:2014-12-25 18:56:38

标签: ios swift uitabbarcontroller nsnotificationcenter message-passing

我正试图在标签栏控制器之间传递数据,但是它不起作用。 第一控制员:

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


}

}

我做错了什么?怎么改变?

2 个答案:

答案 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)

}