更新:我已经尝试将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输出:
答案 0 :(得分:1)
您的问题与NSUserDefaults
无关,nil
是您的第二个控制器中的标签username
,password
等。
您应该在按钮上添加一个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!")
}