应用程序崩溃与EXC_BREAKPOINT错误

问题描述 投票:4回答:2

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

    }
ios iphone xcode swift
2个回答
5
投票

如果没有注册默认值,NSUserDefaults会返回一个对象的nil。当您打开nil值时,您将收到运行时错误(崩溃)。

Apple建议将任何键的默认值注册为占位符,直到第一次保存自定义值。

AppDelegate添加applicationDidFinshLaunching

let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["username" : "", "password" : "", "notifications" : false]
defaults.registerDefaults(defaultValues)

Swift 3+

let defaults = UserDefaults.standard
let defaultValues : [String : Any] = ["username" : "", "password" : "", "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")

Swift 3+

let defaults = UserDefaults.standard
let dusername = defaults.string(forKey:"username")!
let dpassword = defaults.string(forKey:"password")!
let dnotifications = defaults.bool(forKey:"notifications")

始终使用stringForKey表示String值,使用boolForKey表示Bool值。 切勿将valueForKeyNSUserDefaults一起使用,这是一种特殊的KVC方法。

然后这个代码也可以简化:

username!.text = dusername
password!.text = dpassword
notifications.setOn(dnotifications, animated: true)

当写入用户默认值时,使用setBool:forKey作为Bool值,但是没有String等价,setObject:forKey是正确的。


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
}
© www.soinside.com 2019 - 2024. All rights reserved.