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
是您在第二个控制器中的标签 username
、password
等。
您应该向您的按钮(带有 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!")
}
更新:我尝试将 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
是您在第二个控制器中的标签 username
、password
等。
您应该向您的按钮(带有 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!")
}