NSUserDefaults在Swift中失去价值

时间:2015-07-02 19:58:43

标签: ios swift nsuserdefaults

更新:我已经尝试将setValue更改为setObject,并且发生了同样的错误。使用断点和LLDB进行进一步调查后,在控制器出现之前它们是零。我没有正确保存它们。

我试图简单地保存几个文本字符串,然后使用Swift将它们显示在另一个视图上。我不知道为什么我会遇到这么困难。以下是我试图完成此任务的方法: VC1

@IBAction func registerTapped(sender : AnyObject) 
        // Save the login information

        let defaults = NSUserDefaults.standardUserDefaults()

        defaults.setValue(username.text, forKey: "username")
        defaults.setValue(password.text, forKey: "password")


        if firstName.text.isEmpty == false {
            defaults.setValue(firstName.text, forKey: "firstname")
        }

        if lastName.text.isEmpty == false {
            defaults.setValue(lastName.text, forKey: "lastname")
        }

        let profileView = ProfileViewController()
        self.presentViewController(profileView, animated: true, completion: nil)
    }
}

冷却。这似乎是根据我的研究在UITextFields中保存字符串的正确方法。所以,我打开VC2并尝试将保存的文本加载到新的UITextField中,如下所示:

override func viewDidLoad() {
        super.viewDidLoad()

        let defaults = NSUserDefaults.standardUserDefaults()

        username.text = defaults.stringForKey("username")
        password.text = defaults.stringForKey("password")

        if let first = defaults.stringForKey("firstname")
        {
            firstName.text = first
        }
        if let last = defaults.stringForKey("lastname") {
            lastName.text = last
        }
}

我得到了崩溃fatal error: unexpectedly found nil while unwrapping an Optional value。我已经挖了几个小时的教程,不能为我的生活弄清楚我做错了什么。

是因为它是可选的吗?这是我的LLDB输出: enter image description here

2 个答案:

答案 0 :(得分:1)

您的问题与NSUserDefaults无关,nil是您的第二个控制器中的标签usernamepassword等。

您应该在按钮上添加一个segue(带有registerTapped的按钮)以显示第二个控制器并删除registerTapped中的最后两行。

答案 1 :(得分:0)

将代码分解为步骤并调试每个代码。如果您的插座是零或者键/值对不存在,您的代码将崩溃。检查用户名和密码(文本字段)是否都不为零,以及默认结果不是

var text: String?

text = defaults.stringForKey("username")
if let text = text
{
  if let username = username
  {
  username.text = text
  }
  else
  {
    println("username field is nil!")
  }
}
else
{
  println("defaults stringForKey("username") = nil!")
}

text = defaults.stringForKey("password")
if let text = text
{
  if let password = password
  {
  password.text = text
  }
  else
  {
    println("password field is nil!")
  }
}
else
{
  println("defaults stringForKey("password") = nil!")
}