正如我在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"
}
}
答案 0 :(得分:0)
使用通知对于此用例不会很好,并且没有必要。我将交换机的值称为mySetting。
MyViewController (将使用mySetting的视图控制器)
viewWillAppear(_:)
中的UserDefaults读取mySetting并使用它SettingsViewController (包含开关的视图控制器)
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()。