ios – 应用程序崩溃与EXC_BREAKPOINT错误

前端之家收集整理的这篇文章主要介绍了ios – 应用程序崩溃与EXC_BREAKPOINT错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个我在 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")
    }

    }

解决方法

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

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

在AppDelegate中添加applicationDidFinshLaunching

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

斯威夫特3

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

斯威夫特3

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

对于String值始终使用stringForKey,对Bool值使用boolForKey.
永远不要将valueForKey与NSUserDefaults一起使用,NSUserDefaults是一种特殊的KVC方法.

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

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

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

猜你在找的Xcode相关文章