Swift 中的 NSUserDefaults 丢失值

NSUserDefaults Loosing Value in Swift

更新:我尝试将 setValue 更改为 setObject,同样的错误 occurred.Upon 进一步调查断点和 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 输出:

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

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

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

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