我有一个我在Xcode 7.2中制作的应用程序。我有一个主菜单,其中一个按钮有一个设置视图控制器的segue。设置视图控制器具有以下代码,每次到达该视图控制器时,它都会因EXC_BREAKPOINT错误而崩溃。有趣的是,这只发生在运行iOS 7的iPhone 4上。它不会在运行iOS 9的iOS模拟器iPhone 6中崩溃。
无论如何,这是代码。
//
// SettingsController.swift
// Arbor Hills iOS
//
// Created by Andrew on 11/22/15.
// Copyright © 2015 Arbor Hills Vet. All rights reserved.
//
import UIKit
class SettingsController: UITableViewController {
@IBOutlet weak var username: UITextField!
@IBOutlet weak var password: UITextField!
@IBOutlet weak var notifications: UISwitch!
override func viewDidLoad(){
super.viewDidLoad()
let defaults = NSUserDefaults.standardUserDefaults()
let dusername = defaults.valueForKey("username")!
let dpassword = defaults.valueForKey("password")!
let dnotifications = defaults.valueForKey("notifications")!
username!.text = String(dusername)
password!.text = String(dpassword)
if(dnotifications as! Bool == true){
notifications.setOn(true, animated: true)
}else{
notifications.setOn(false, animated:true)
}
}
@IBAction func saveUsername(sender: AnyObject) {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(username.text!, forKey: "username")
}
@IBAction func savePassword(sender: AnyObject) {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(password.text!, forKey: "password")
}
@IBAction func notificationsModified(sender: AnyObject) {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(notifications.on, forKey: "notifications")
}
}
如果没有注册默认值,NSUserDefaults
会返回一个对象的nil
。当您打开nil
值时,您将收到运行时错误(崩溃)。
Apple建议将任何键的默认值注册为占位符,直到第一次保存自定义值。
在AppDelegate
添加applicationDidFinshLaunching
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["username" : "", "password" : "", "notifications" : false]
defaults.registerDefaults(defaultValues)
Swift 3+
let defaults = UserDefaults.standard
let defaultValues : [String : Any] = ["username" : "", "password" : "", "notifications" : false]
userDefaults.register(defaults: defaultValues)
这会记录空字符串和布尔值false
。
然后,您可以安全地检索值
let defaults = NSUserDefaults.standardUserDefaults()
let dusername = defaults.stringForKey("username")!
let dpassword = defaults.stringForKey("password")!
let dnotifications = defaults.boolForKey("notifications")
Swift 3+
let defaults = UserDefaults.standard
let dusername = defaults.string(forKey:"username")!
let dpassword = defaults.string(forKey:"password")!
let dnotifications = defaults.bool(forKey:"notifications")
始终使用stringForKey
表示String
值,使用boolForKey
表示Bool
值。
切勿将valueForKey
与NSUserDefaults
一起使用,这是一种特殊的KVC方法。
然后这个代码也可以简化:
username!.text = dusername
password!.text = dpassword
notifications.setOn(dnotifications, animated: true)
当写入用户默认值时,使用setBool:forKey
作为Bool
值,但是没有String
等价,setObject:forKey
是正确的。
您不应该使用valueForKey从NSUserDefaults获取对象。这是一种键值编码方法。 (请参阅NSKeyValueCoding上的链接。你想要objectForKey,你需要检查nil后记:
let defaults = NSUserDefaults.standardUserDefaults()
if let dusername = defaults.objectForKey("username") as String
{
//code to use the username
}
else
{
//code to handle the case where there is no username
}