应用程序崩溃与EXC_BREAKPOINT错误

时间:2015-11-22 15:33:32

标签: ios iphone xcode swift

我有一个我在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")
    }

    }

2 个答案:

答案 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值。
从不NSUserDefaultsusername!.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
}