应用程序崩溃与EXC_BREAKPOINT错误
我有一个应用程序,我在Xcode 7.2中。 我有一个主菜单,有一个button,有一个继续到设置视图控制器。 设置视图控制器有以下代码,每当我到达该视图控制器,它崩溃与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
值,你会得到一个运行时错误(崩溃)。
Applebuild议将任何键的默认值作为占位符注册,直到首次保存自定义值。
在AppDelegate
添加applicationDidFinshLaunching
let defaults = NSUserDefaults.standardUserDefaults() let defaultValues = ["username" : "", "password" : "", "notifications" : false] defaults.registerDefaults(defaultValues)
这注册空string和一个布尔值false
。
然后,您可以安全地检索值
let defaults = NSUserDefaults.standardUserDefaults() let dusername = defaults.stringForKey("username")! let dpassword = defaults.stringForKey("password")! let dnotifications = defaults.boolForKey("notifications")
对于String
值总是使用stringForKey
,对于Bool
值总是使用stringForKey
。
永远不要使用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 }