2017-02-27 51 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()

相关问题