2017-02-27 43 views
0

正如我在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

與其讓您的設置控制器嘗試猜測其他VC能夠接收通知的時間,如何讓其他VC在需要時向您的數據模型詢問信息? ...'viewDidAppear' /'viewWillAppear'是可能的候選人。 –

+0

已經嘗試在viewDidAppear上接收通知。但就像以前一樣,視圖不會每次出現或加載。它始終在後臺。 – Gabe12

+0

我說「問你的數據模型」不是「收到通知」。據推測,VC只需要更新屏幕時的數據。 –

回答

0

使用通知將不用於該用途的情況下很好地工作,並沒有必要。我將把交換機的值稱爲mySetting。

MyViewController(將使用mySetting視圖控制器)從UserDefaults在viewWillAppear(_:)

  • 讀mySetting並使用它

SettingsViewController(包含開關視圖控制器)

  • read從UserDefaults mySetting並在viewWillAppear(_:)
  • 寫mySetting到UserDefaults分配給交換機時,交換機上引發了valueChanged事件

除非你的酥料餅目前SettingsViewController的viewWillAppear(_:)實施MyViewController將被執行時它是新加載的以及從任何其他視圖控制器返回時的新加載。

0

每次我解散設置視圖時,變量savedValue都不會刷新自己。這是因爲其他ViewController每次都沒有加載。我做的是我創建了一個新的函數,當通知被調用時(這是在設置視圖關閉時)運行。下面是代碼:

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

    } 

注意的addObserver現在調用函數retrieveValue()

相關問題