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

时间:2017-02-27 19:56:06

标签: ios swift swift3 viewcontroller nsnotificationcenter

正如我在question中解释的那样,我试图将数据从TableView中的UISwitch传递到另一个ViewController。但是,我希望在设置视图(包含UISwitch)被取消时传递数据。在这个伟大的answer的第三步之后,我使用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"
        }

    }

2 个答案:

答案 0 :(得分:0)

使用通知对于此用例不会很好,并且没有必要。我将交换机的值称为mySetting。

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

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

SettingsViewController (包含开关的视图控制器)

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

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

答案 1 :(得分:0)

每次我关闭设置视图时,变量savedValue都没有刷新。这是因为其他ViewController每次都没有加载自己。我所做的是创建了一个新函数,该函数在调用通知时运行(在取消设置视图时)。这是代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import Adafruit_BMP.BMP085 as BMP085
#import cgi
sensor = BMP085.BMP085()

temperature=sensor.read_temperature()
pressure=sensor.read_pressure()
pressure=pressure/100.0

print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<body>'
print "%.2f °C" %temperature
print "%.2f hPa" %pressure
print '</body>'
print '</html>'

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