【问题标题】:NSUserDefaults Color Error (Swift) [duplicate]NSUserDefaults 颜色错误(Swift)[重复]
【发布时间】:2017-01-04 21:18:57
【问题描述】:

每当我保存如下所示的颜色时:

slitherColor = sender.currentTitleColor
let userDefaults3 = NSUserDefaults.standardUserDefaults()
userDefaults3.setValue(slitherColor, forKey: "SSlitherC")
userDefaults3.synchronize()

我收到一个 SIGABRT 错误。当屏幕第一次加载时,这是我用来加载不存在的数据而没有错误的:

let userDefaults3 = NSUserDefaults.standardUserDefaults()
if let slitherColor2 = userDefaults.valueForKey("SSlitherC") {
    slitherColor = slitherColor2 as! UIColor
  }
    else {
    slitherColor = UIColor.yellowColor()    
  }

关于如何修复此错误的任何帮助?另外,这里是 SIGABRT 错误消息:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object UIDeviceRGBColorSpace 0.0352708 1 0.161752 1 for key SSlitherC'

【问题讨论】:

  • UIColors 不能直接保存到NSUserDefaults

标签: ios swift xcode nsuserdefaults uicolor


【解决方案1】:

UIColors 不能直接保存在 NSUserDefaults 中,因为 NSUserDefaults 基本上是一种为您的应用访问 Plist 文件的美化方式。相反,您可以使用 NSKeyedArchiver 归档和取消归档颜色,以便正确保存。

将您的保存代码更改为:

slitherColor = sender.currentTitleColor
let userDefaults3 = NSUserDefaults.standardUserDefaults()
let slitherColorData = NSKeyedArchiver.archivedDataWithRootObject(slitherColor)
userDefaults3.setObject(slitherColorData, forKey: "SSlitherC")
userDefaults3.synchronize()

以及获取颜色的代码:

let userDefaults3 = NSUserDefaults.standardUserDefaults()
if let slitherColorData2 = userDefaults3.dataForKey("SSlitherC"), let slitherColor2 = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor {
    slitherColor = slitherColor2
} else {
    slitherColor = UIColor.yellowColor()    
}

【讨论】:

  • (colorData) 在第二部分不起作用。什么意思?
  • 别在意我上面的评论。我修复了那部分。现在我正在运行代码并收到另一个 SIGABRT 错误:由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'*** -CGColor 未为 UIColor 定义;需要先转换颜色空间。'当我尝试加载我已经保存的颜色时会发生这种情况。请帮助
  • 顺便说一下@Stacksza 我用“archivedDataWithRootObject(slitherColor)”替换了“colorData”
【解决方案2】:

您不能将UIColor 直接保存到NSUserDefaults,为此您需要归档和取消归档颜色对象并保存数据。 保存:

let colorData = NSKeyedArchiver.archivedDataWithRootObject(slitherColor)
userDefaults3.setObject(slitherColor, forKey: "SSlitherC")

然后返回:

if let colorData = userDefaults3.dataForKey(key) {
  let color = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor
}

Here是 NSUserDefautls 的扩展,它有助于保存和检索数据。如果 gist 文件被删除我们仍然有有效的信息,我将在此处复制代码。

extension NSUserDefaults {

    func colorForKey(key: String) -> UIColor? {
        var color: UIColor?
        if let colorData = dataForKey(key) {
            color = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor
        }
        return color
    }

    func setColor(color: UIColor?, forKey key: String) {
        var colorData: NSData?
        if let color = color {
            colorData = NSKeyedArchiver.archivedDataWithRootObject(color)
        }
        setObject(colorData, forKey: key)
    }

}

你可以调用这个方法

  1. 设置保存颜色userDefaults.setColor(color: color, forKey key: key)

  2. 获取色键userDefaults.colorForKey(key)

Swift 3.0:

扩展用户默认值 {

func color(forKey key: String) -> UIColor? {
    var color: UIColor?
    if let colorData = data(forKey: key) {
        color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
    }
    return color
}

func set(color: UIColor?, forKey key: String) {
    var colorData: NSData?
    if let color = color {
        colorData = NSKeyedArchiver.archivedData(withRootObject: color)
    }
    set(colorData, forKey: key)
}

}

用法:

let userDefault = UserDefaults.standard
userDefault.set(color: color, forKey: key)
userDefault.color(forKey: key)

【讨论】:

  • 你能说得更具体点吗? (在示例中使用我的数据和对象)
  • 您不能将所有自定义对象保存在用户默认值中,因此您需要将其归档到 NSData,然后将其保存为对象。我建议复制这个扩展并使用这些方法,它会照顾好每一件事。
  • @AndyLebo 我也有 swift 3.0 的更新答案。复制粘贴扩展并使用设置的颜色和关键方法的颜色。
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2018-08-26
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多