是否可以使用NSUserDefaults在ViewControllers之间持久存储和传递数据

时间:2016-01-27 13:17:16

标签: ios nsuserdefaults

我最近遇到website,其中博主建议不要使用 NSUserDefaults 在viewControllers之间传递数据,这是我一直使用的方法。

这就是我使用NSUserDefaults来存储应用程序的用户设置值的方法。

1 - 我在我的主ViewController中做的第一件事是为我的所有键添加常量变量,以便能够全局读取它们。

 let kOne= "keyOne"
 let kTwo = "keyTwo"
 class ViewController: UIViewController{
     //code...
 }

2 - 在 AppDelegate.swift 中,我在 didFinishLaunchingWithOptions 方法中初始化了所有关键值。

    // set default values for NSUserdefaults keys
    NSUserDefaults.standardUserDefaults().registerDefaults([ kOne : "0", kTwo:"0" ])

3 - 然后在我的ViewController中读取值。

func keyOneFromDisc()->Double{
   let keyOneValue:String = NSUserDefaults.standardUserDefaults().stringForKey(kOne)!
   return Double(keyOneValue)!
}

   // do something with the value...

4 - 在 SettingsViewController 中,我再次阅读并保存NSUserDefaults。

    func keyOneFromDisc()->Double{
         let keyOneValue:String = NSUserDefaults.standardUserDefaults().stringForKey(kOne)!
        return Double(keyOneValue)!
    }
// more functions...

// save my settings
    @IBAction func saveSettings(sender: AnyObject) {

        NSUserDefaults.standardUserDefaults().setObject(someValueFromAnInputField.text, forKey: kOne)
// more keys
    }

我这是一个不好的做法吗?

实现上述目标的更好方法是什么?

  编辑:对于这种困惑感到抱歉,我忘了提到我其实   需要坚持我传递的数据。我传递数据时使用prepareForSegue不需要保留。

3 个答案:

答案 0 :(得分:2)

您可以使用public class MyListener { private static final Logger log = Logger.getLogger(MyListener.class.getName()); public MyListener() { } @PostPersist @PostUpdate @PostRemove public void onPostPersist(MyClass object) { log.fine("Firing changed entity event"); } } 存储较少量的数据,例如登录目的或BOOL标志等。但每次无法存储数据以进行ViewController的转换。

为此目的,您可以使用

NSUSerdefault

答案 1 :(得分:1)

NSUserDefault用于在应用程序执行之间保留数据。问题是何时数据将被保存(如果我没记错的话)。

我这样做的方式是通过共享的模型对象为兄弟VC,或通过关系&当存在父/子视图控制器时,VC之间的委派。

答案 2 :(得分:-2)

最好在prepareForSegue方法中在控制器和传输数据中创建变量。但如果这个数据是一个且仅适用于整个应用程序 - 您只需将其存储在AppDelegate中即可。它可以从您应用的任何位置读取和保存这些数据。