我有一个我在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")
}
}
答案 0 :(得分:5)
nil
会返回对象nil
。当您打开AppDelegate
值时,您将收到运行时错误(崩溃)。
Apple建议将任何键的默认值注册为占位符,直到第一次保存自定义值为止。
在applicationDidFinshLaunching
中添加let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["username" : "", "password" : "", "notifications" : false]
defaults.registerDefaults(defaultValues)
let defaults = UserDefaults.standard
let defaultValues : [String : Any] = ["username" : "", "password" : "", "notifications" : false]
userDefaults.register(defaults: defaultValues)
Swift 3 +
false
注册空字符串和布尔值let defaults = NSUserDefaults.standardUserDefaults()
let dusername = defaults.stringForKey("username")!
let dpassword = defaults.stringForKey("password")!
let dnotifications = defaults.boolForKey("notifications")
然后,您可以安全地检索值
let defaults = UserDefaults.standard
let dusername = defaults.string(forKey:"username")!
let dpassword = defaults.string(forKey:"password")!
let dnotifications = defaults.bool(forKey:"notifications")
Swift 3 +
stringForKey
始终String
用于boolForKey
值,Bool
用于valueForKey
值。
从不将NSUserDefaults
与username!.text = dusername
password!.text = dpassword
notifications.setOn(dnotifications, animated: true)
一起使用,这是一种特殊的KVC方法。
然后这段代码也可以简化:
setBool:forKey
写入用户默认值时,Bool
使用String
值,但没有setObject:forKey
个等效项,static int count = 0;
count++;
if (count % 2 != 0) {}
是正确的。
答案 1 :(得分:0)
您不应该使用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
}