2017-02-27 5 views
0

Wie ich in diesem question erklärt habe, versuche ich Daten von einem UISwitch in einem TableView zu einem anderen ViewController zu übergeben. Ich möchte jedoch, dass die Daten übergeben werden, wenn die Einstellungsansicht (die den UISwitch enthält) geschlossen wird. Nach dem dritten Schritt dieses großen answer benutze ich UserDefaults, um die Daten zu übergeben und zu versuchen, NotificationCenter zu verwenden, um die Werte von UserDefaults zu aktualisieren, wenn die Einstellungsansicht verwarf.Empfangen einer Benachrichtigung ohne Laden der Ansicht

Um zu aktualisieren, wenn Benutzerstandardwerte sich ändern, können Sie Ihren Einstellungscontroller eine Benachrichtigung beim Ablehnen veröffentlichen. Dann könnten andere VCs in Ihrer App auf diese Benachrichtigung warten und sie bei Bedarf aktualisieren.

Ich habe versucht, die Benachrichtigung innerhalb viewDidLoad Abrufen, aber der Wert nicht aktualisiert wird, weil die Einstellungen anzeigen Entlassung nicht geladen den neuen Viewcontroller jedes Mal.

Wie kann ich eine Benachrichtigung erhalten/lesen, wenn die Einstellungsansicht beendet wird? Genauer gesagt, wo und wie würde ich den Code zum Lesen der Benachrichtigung schreiben?


Hier ist der Code für die Benachrichtigung der Veröffentlichung:

class SettingsViewController: UIViewController { 

@IBAction func doneButton(_ sender: UIButton) { 

    self.dismiss(animated: true, completion: nil) 
    NotificationCenter.default.post(name: Notification.Name("nSound"), object: nil) 

} 

der Code Hier ist die Benachrichtigung für das Abrufen:

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

Anstatt zu versuchen, Ihren Einstellungscontroller zu erraten, wenn andere VCs eine Benachrichtigung erhalten können, stellen Sie die anderen VCs auffordern, Ihr Datenmodell nach Informationen zu fragen, wenn sie es benötigen. ... 'viewDidAppear' /' viewWillAppear' sind mögliche Kandidaten. –

+0

Bereits versucht, die Benachrichtigung bei viewDidAppear zu erhalten. Aber genauso wie zuvor erscheint oder erscheint die Ansicht nicht jedes Mal. Es ist immer da im Hintergrund. – Gabe12

+0

Ich sagte "fragen Sie Ihr Datenmodell" nicht "Benachrichtigung erhalten". Vermutlich benötigt ein VC nur die Daten an dem Punkt, an dem der Bildschirm aktualisiert wird. –

Antwort

0

Mit Benachrichtigungen werden nicht sehr gut für diesen Anwendungsfall arbeiten, und es ist nicht notwendig. Ich werde den Wert des Schalters als mySetting bezeichnen.

MyViewController (View-Controller, die mySetting verwenden)

  • lesen mySetting von UserDefaults in viewWillAppear(_:) und es verwenden

SettingsViewController (View-Controller mit dem Schalter)

  • lesen mySetting von UserDefaults und weisen Sie auf den Schalter in viewWillAppear(_:)
  • Schreib mySetting zu UserDefaults wenn ein valueChanged Ereignis auf dem
  • Schalter ausgelöst wird

Sofern Sie nicht vorhanden SettingsViewController in einem popover, die viewWillAppear(_:) Implementierung von MyViewController ausgeführt wird, wenn Es ist neu geladen sowie wenn Sie von einem anderen View-Controller zu ihm zurückkehren.

0

Die Variable savedValue wurde nicht jedes Mal aktualisiert, wenn ich die Einstellungsansicht verwarf. Dies liegt daran, dass sich der andere ViewController nicht jedes Mal selbst geladen hat. Was ich getan habe, ist, dass ich eine neue Funktion erstellt habe, die ausgeführt wird, wenn die Benachrichtigung aufgerufen wird (wenn die Einstellungsansicht beendet wird).Hier ist der Code:

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

    } 

Beachten Sie, dass addObserver jetzt ruft die Funktion retrieveValue().

Verwandte Themen