我有一个我在
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)
斯威夫特3
let defaults = UserDefaults.standard let defaultValues : [String : Any] = ["username" : "","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")
斯威夫特3
let defaults = UserDefaults.standard let dusername = defaults.string(forKey:"username")! let dpassword = defaults.string(forKey:"password")! let dnotifications = defaults.bool(forKey:"notifications")
对于String值始终使用stringForKey,对Bool值使用boolForKey.
永远不要将valueForKey与NSUserDefaults一起使用,NSUserDefaults是一种特殊的KVC方法.
然后这个代码也可以简化:
username!.text = dusername password!.text = dpassword notifications.setOn(dnotifications,animated: true)
写入用户默认值时,使用setBool:forKey作为Bool值,但是没有等效的String,setObject:forKey是正确的.