在不加载视图的情况下接收通知

正如我在这个问题中解释的,我试图将数据从一个TableView中的UISwitch传递到另一个ViewController。 但是,我希望在设置视图(包含UISwitch)被解散时传递数据。 在这个伟大的答案的第三个步骤之后,我使用UserDefaults来传递数据,并尝试使用NotificationCenter来更新UserDefaults值,当解散设置视图。

要更新用户默认值更改时,您可以让您的设置控制器解雇时发布通知。 然后,您应用中的其他VC可以侦听此通知并根据需要进行更新。

我已经尝试检索viewDidLoad内的通知,但值不会刷新,因为解散设置视图不会每次加载新的ViewController。

每次设置视图被解除时,我怎样才能接收/阅读通知? 更确切地说,我在哪里以及如何编写阅读通知的代码?


以下是发布通知的代码:

class SettingsViewController: UIViewController { @IBAction func doneButton(_ sender: UIButton) { self.dismiss(animated: true, completion: nil) NotificationCenter.default.post(name: Notification.Name("nSound"), object: nil) } 

以下是检索通知的代码:

  class ViewController: UIViewController { @IBOutlet weak var testLabel: UILabel! var savedValue = UserDefaults.standard.bool(forKey: "sound") override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(ViewController.viewDidLoad), name: Notification.Name("nSound"), object: nil) //refresh the savedValue variable savedValue = UserDefaults.standard.bool(forKey: "sound") //test the savedValue variable if (savedValue == true) { testLabel.text = "yes" } else { testLabel.text = "no" } } 

使用通知对于这个用例来说效果不好,而且没有必要。 我将把交换机的值称为mySetting。

MyViewController (将使用mySetting的视图控制器)

  • viewWillAppear(_:) UserDefaults中读取mySetting并使用它

SettingsViewController (包含交换机的视图控制器)

  • 从UserDefaults读取mySetting并将其分配给viewWillAppear(_:)的交换机
  • 在交换机上触发valueChanged事件时,将mySetting写入UserDefaults

除非在popup窗口中显示SettingsViewController,否则在从新加载以及从任何其他视图控制器返回时,将执行MyViewController的viewWillAppear(_:)实现。

variablessavedValue没有刷新自己每次我解散设置视图。 这是因为其他ViewController每次都没有加载。 我所做的是我创build了一个新的函数,当通知被调用时(这是当设置视图closures时)运行。 这里是代码:

 class ViewController: UIViewController { @IBOutlet weak var testLabel: UILabel! var savedValue = UserDefaults.standard.bool(forKey: "sound") override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(ViewController.retrieveValue), name: Notification.Name("nSound"), object: nil) //For when the view appears the first time savedValue = UserDefaults.standard.bool(forKey: "sound") if (savedValue == true) { testLabel.text = "yes" } else { testLabel.text = "no" } } func retrieveValue() { //refresh the savedValue variable savedValue = UserDefaults.standard.bool(forKey: "sound") //test the savedValue variable if (savedValue == true) { testLabel.text = "yes" } else { testLabel.text = "no" } } 

请注意, addObserver现在调用函数retrieveValue()