Objective c 将UIColor保存到NSUserDefaults并从中加载

Objective c 将UIColor保存到NSUserDefaults并从中加载,objective-c,cocoa-touch,nsuserdefaults,uicolor,Objective C,Cocoa Touch,Nsuserdefaults,Uicolor,将UIColor保存到NSUserDefaults并将其取出的最简单方法是什么?编辑2:我似乎已经找到了。查看Erica Sadun关于扩展UIColor的文章 编辑:此代码似乎不适用于UIColor对象。不知道为什么 下面是一些代码: 将对象保存到NSUserDefault中: NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults]; [userDefaults setObject:someColorObject

UIColor
保存到
NSUserDefaults
并将其取出的最简单方法是什么?

编辑2:我似乎已经找到了。查看Erica Sadun关于扩展UIColor的文章

编辑:此代码似乎不适用于UIColor对象。不知道为什么

下面是一些代码:

将对象保存到NSUserDefault中:

 NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
[userDefaults setObject:someColorObject forKey:@"myColor"];
NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
UIColor *someColor = (UIColor *)[userDefaults objectForKey:@"myColor"];
从NSUserDefault读取对象:

 NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
[userDefaults setObject:someColorObject forKey:@"myColor"];
NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
UIColor *someColor = (UIColor *)[userDefaults objectForKey:@"myColor"];

一种方法可能是将其归档(就像使用NSColor一样,尽管我还没有对此进行测试):

为了找回它:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

我自己得到了答案

拯救

装载

谢谢你的帮助。我真的不喜欢在首选项中保存4个浮动,只想要一个条目

因此,使用Erica的
UIColor
类别,我能够将RGB颜色转换为可以保存在首选项中的
NSString

// Save a color
NSString *theColorStr = [self.artistColor stringFromColor];
[[NSUserDefaults standardUserDefaults] setObject:theColorStr forKey:@"myColor"];

// Read a color
NSString *theColorStr = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
if ([theColorStr length] > 0) {
    self.myColor = [UIColor colorWithString:theColorStr];
} else {
    self.myColor = [UIColor colorWithRed:88.0/255.0 green:151.0/255.0 blue:237.0/255.0 alpha:1.0];
}
使用,您很快就会在代码中找到大量的NSKeyed归档和unarchive。一个更干净的解决方案是扩展UserDefaults。这正是扩展的目的;USEKORT可能不知道UICOLR是什么,因为UIKIT和基金会是不同的框架。 敏捷的 Swift 4.2 用法 这也可以在具有类别的Objective-C中完成


我添加了Swift文件作为要点。

我需要以用户默认值存储
UIColor
对象数组。正如其他答案所述,这个想法是将
UIColor
转换为数据并保存该数据。我在
UIColor
上进行了扩展:

extension UIColor {
   func data() -> Data {
      return NSKeyedArchiver.archivedData(withRootObject: self)
   }
   class func color(withData data: Data) -> UIColor? {
      return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor
   }
}
用法:

fileprivate var savedColors: [UIColor]? {
    get {
        if let colorDataArray = UserDefaults.standard.array(forKey: Constants.savedColorsKey) as? [Data] {
            return colorDataArray.map { UIColor.color(withData: $0)! }
        }
        return nil
    }
    set {
        if let colorDataArray = newValue?.map({ $0.data() }) {
            UserDefaults.standard.set(colorDataArray, forKey: Constants.savedColorsKey)
        }

    }
}
Swift 3,
UserDefaults
Extension 示例使用
这个答案是基于。它已更新为Swift 3。

Swift
非常感谢您的帮助,但NSUserDefaults似乎无法保存UIColor对象嗯,让我试试上面发布的代码——我只是从内存中编写的。请查看我在帖子正文中链接的文章。这不起作用,因为NSUserDefaults只能存储属性列表对象:NSString、NSNumber、NSDate、NSData、NSArray和NSDictionary(其中所有键必须为字符串)。其他任何内容都必须作为这些对象之一进行编码。唯一可能出现的问题是,基础CGColor是否不在RGB颜色空间中。如果您确定它将是RGB,则这可能是一个比存档更好的选项。除了RGB假设之外,一旦您有两种或更多颜色要保留,此解决方案将变得烦人。理想情况下,您可以ant将所有颜色信息存储在一个键(而不是四个键)下,然后编写一个通用的get/set函数。UIColor实现了NSCoding协议,因此存档将起作用。这种方法将颜色序列化为315字节的数据。这似乎有点浪费。由lifjoy的答案引用的Erica Sadun的UIColor类别似乎是一个更好的解决方案is way还保存与颜色关联的颜色配置文件。如果这对您不重要,当然。@Wevah这似乎不适用于CCColor,您对此有什么想法吗?在Swift中:
var colorData:NSData=NSKeyedArchiver.archivedDataWithRootObject(color);默认值。setObject(colorData,forKey:“BackgroundColor”);
查看
[NSUserDefaults registerDefaults::
设置默认值(这样在读取值时可以避免if/else)。UIColor EXTENDED.m和UIColor EXTENDED.h文件可以在此处找到:您也可以在Objective-C中使用类别执行此操作。将UIColor保存为原始二进制数据,而不使用NSKeyedArchiver//NSKEYEDAUNARCHIVER(非编码)
extension UserDefaults {

    func color(forKey key: String) -> UIColor? {

        guard let colorData = data(forKey: key) else { return nil }

        do {
            return try NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)
        } catch let error {
            print("color error \(error.localizedDescription)")
            return nil
        }

    }

    func set(_ value: UIColor?, forKey key: String) {

        guard let color = value else { return }
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: false)
            set(data, forKey: key)
        } catch let error {
            print("error color key data not saved \(error.localizedDescription)")
        }

    }

}
UserDefaults.standard.set(UIColor.white, forKey: "white")
let whiteColor = UserDefaults.standard.color(forKey: "white")
extension UIColor {
   func data() -> Data {
      return NSKeyedArchiver.archivedData(withRootObject: self)
   }
   class func color(withData data: Data) -> UIColor? {
      return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor
   }
}
fileprivate var savedColors: [UIColor]? {
    get {
        if let colorDataArray = UserDefaults.standard.array(forKey: Constants.savedColorsKey) as? [Data] {
            return colorDataArray.map { UIColor.color(withData: $0)! }
        }
        return nil
    }
    set {
        if let colorDataArray = newValue?.map({ $0.data() }) {
            UserDefaults.standard.set(colorDataArray, forKey: Constants.savedColorsKey)
        }

    }
}
extension UserDefaults {

    internal func color(forKey key: String) -> UIColor? {
        guard let colorData = data(forKey: key) else {
            return nil
        }

        return NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
    }

    internal func setColor(_ color: UIColor?, forKey key: String) {
        let colorData: Data?
        if let color = color {
            colorData = NSKeyedArchiver.archivedData(withRootObject: color)
        }
        else {
            colorData = nil
        }

        set(colorData, forKey: key)
    }
}
let colorKey = "favoriteColor"

UserDefaults.standard.setColor(UIColor.red, forKey: colorKey)
let favoriteColor = UserDefaults.standard.color(forKey: colorKey)

print("favoriteColor is red: '\(favoriteColor == UIColor.red)'")
private let colorPickerKey = "ColorPickerKey"

var selectedColor: UIColor? {
    get {
        guard let colorData = UserDefaults.standard.object(forKey: colorPickerKey) as? Data,
            let color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor else { return nil }
        return color
    } set {
        guard let newValue = newValue else {
            UserDefaults.standard.removeObject(forKey: colorPickerKey)
            return
        }
        let colorData = NSKeyedArchiver.archivedData(withRootObject: newValue)
        UserDefaults.standard.set(colorData, forKey: colorPickerKey)
    }
}