2017-02-27 2 views
0

この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" 
     } 

    } 
+0

他のVCが通知を受け取るタイミングを設定コントローラが推測するのではなく、他のVCがデータモデルに必要なときに情報を要求するのはどうですか? ... 'viewDidAppear' /' viewWillAppear'が候補です。 –

+0

既にviewDidAppearで通知を受信しようとしました。しかし、前と同じように、ビューは表示されず、毎回ロードされません。それはいつもバックグラウンドにあります。 – Gabe12

+0

私は「あなたのデータモデルに尋ねる」は「通知を受け取る」ではないと言った。おそらく、VCは画面を更新する時点でデータを必要とするだけです。 –

答えて

0

通知を使用すると、このユースケースのために非常にうまく機能しません、それは必要ではありません。私はスイッチの値をmySettingと呼んでいます。

MyViewController(mySettingを使用するビューコントローラ)viewWillAppear(_:)でUserDefaultsから

  • 読み出しmySettingを使い、それ

SettingsViewController(スイッチを含むビュー・コントローラ)

  • 読み取り

あなたはポップオーバーに存在SettingsViewController、MyViewControllerのviewWillAppear(_:)実装をしたときに実行される場合を除きvalueChangedイベントがスイッチでトリガされたときUserDefaultsからmySettingとUserDefaultsにviewWillAppear(_:)

  • 書き込みmySettingにスイッチに割り当てそれはあなたが他のView Controllerから戻ったときだけでなく、新たにロードされます。

  • 0

    設定ビューを無効にするたびに、変数savedValueが自動的に更新されませんでした。これは、他のViewControllerが毎回それ自体をロードしていないためです。私がしたのは、通知が呼び出されたときに実行される新しい機能を作成したことです(これは、設定ビューを閉じたときです)。addObserverは今機能retrieveValue()を呼び出すこと

    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" 
          } 
    
        } 
    

    注:ここでは、コードです。

    関連する問題