从 UserDefaults 保存/获取 UIColor

Posted

技术标签:

【中文标题】从 UserDefaults 保存/获取 UIColor【英文标题】:Save/Get UIColor from UserDefaults 【发布时间】:2019-03-30 16:42:48 【问题描述】:

我需要一些帮助来从 UserDefaults 加载和读取 UIColor。

我找到了一个不错的扩展:

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

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


但是 NSKeyedUnarchiver.unarchiveObject 最近被弃用了,所以我不知道如何从中获取数据。

有什么建议吗? 谢谢!

【问题讨论】:

【参考方案1】:

在您的代码中,只需替换 2 行,即

替换

color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor

color = try! NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)

//// 这里可以使用try? 代替try! 并将其包装在if-let 语句中。您的选择。

替换

colorData = NSKeyedArchiver.archivedData(withRootObject: color) as NSData?

colorData = try? NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: true)

另外,在var colorData: NSData? 中使用Data 而不是NSData,即

var colorData: Data?

【讨论】:

【参考方案2】:

只需按照弃用消息告诉您的操作:

extension UserDefaults 
    func colorForKey(key: String) -> UIColor? 
        if let colorData = data(forKey: key),
            let color = try? NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)
        
            return color
         else 
            return nil
        
    

    // But why an Option<UIColor> here?
    func setColor(color: UIColor?, forKey key: String) 
        if let color = color,
            let colorData = try? NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: true)
        
            set(colorData, forKey: key)
        
    

【讨论】:

你的意思是“为什么这里是 Optional?”至于为什么函数setColor(color:forKey)Color 采用Optional 参数?

以上是关于从 UserDefaults 保存/获取 UIColor的主要内容,如果未能解决你的问题,请参考以下文章

UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?

从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any

SwiftUI:如何使用 UserDefaults 保存选择器数据?

如何使用 UserDefaults 保存已登录状态?

从 UserDefaults 中提取 Picker

通过 INDEX 更新和删除 userDefaults 中的对象