我有一个我在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")
}
}
Run Code Online (Sandbox Code Playgroud)
NSUserDefaultsnil如果没有注册默认值,则返回对象.当您打开一个nil值时,您将收到运行时错误(崩溃).
Apple建议将任何键的默认值注册为占位符,直到第一次保存自定义值.
在AppDelegate中加applicationDidFinshLaunching
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["username" : "", "password" : "", "notifications" : false]
defaults.registerDefaults(defaultValues)
Run Code Online (Sandbox Code Playgroud)
Swift 3+
let defaults = UserDefaults.standard
let defaultValues : [String : Any] = ["username" : "", "password" : "", "notifications" : false]
userDefaults.register(defaults: defaultValues)
Run Code Online (Sandbox Code Playgroud)
它记录空字符串和布尔值false.
然后,您可以安全地检索值
let defaults = NSUserDefaults.standardUserDefaults()
let dusername = defaults.stringForKey("username")!
let dpassword = defaults.stringForKey("password")!
let dnotifications = defaults.boolForKey("notifications")
Run Code Online (Sandbox Code Playgroud)
Swift 3+
let defaults = UserDefaults.standard
let dusername = defaults.string(forKey:"username")!
let dpassword = defaults.string(forKey:"password")!
let dnotifications = defaults.bool(forKey:"notifications")
Run Code Online (Sandbox Code Playgroud)
总是使用stringForKey的String值,并boolForKey为Bool值.
千万不要使用valueForKey带有NSUserDefaults这是一个特殊的KVC方法.
然后这个代码也可以简化:
username!.text = dusername
password!.text = dpassword
notifications.setOn(dnotifications, animated: true)
Run Code Online (Sandbox Code Playgroud)
当写入用户默认值时使用setBool:forKey该Bool值,但是没有String等价物,setObject:forKey是正确的.
| 归档时间: |
|
| 查看次数: |
6555 次 |
| 最近记录: |