このquestionで説明したように、私はTableViewのUISwitchから別のViewControllerにデータを渡そうとしています。ただし、設定ビュー(UISwitchを含む)が閉じられたときにデータが渡されるようにしたい。この素晴らしいanswerの3番目の手順に続いて、私はUserDefaultsを使用してデータを渡し、SettingsViewを終了するときに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"
}
}
他のVCが通知を受け取るタイミングを設定コントローラが推測するのではなく、他のVCがデータモデルに必要なときに情報を要求するのはどうですか? ... 'viewDidAppear' /' viewWillAppear'が候補です。 –
既にviewDidAppearで通知を受信しようとしました。しかし、前と同じように、ビューは表示されず、毎回ロードされません。それはいつもバックグラウンドにあります。 – Gabe12
私は「あなたのデータモデルに尋ねる」は「通知を受け取る」ではないと言った。おそらく、VCは画面を更新する時点でデータを必要とするだけです。 –