将UIColor保存到NSUserDefaults并加载

UIColor保存到NSUserDefaults然后将其恢复的最简单的方法是什么?

通过接受的答案 ,您将很快得到许多NSKeyed档案和整个代码的非存档。 更清洁的解决scheme是扩展NSUserDefaults。 这正是扩展的目的; NSUserDefaults可能不知道UIColor,因为UIKit和Foundation是不同的框架。

迅速

 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) } } 

用法

 NSUserDefaults.standardUserDefaults().setColor(UIColor.whiteColor(), forKey: "white") let whiteColor = NSUserDefaults.standardUserDefaults().colorForKey("white") 

这也可以在Objective-C中用一个类来完成。

我在这里添加了Swift文件。

这样做的一种方法可能是将其归档(像使用NSColor,但我没有testing过):

 NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color]; [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"]; 

为了恢复:

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

我自己已经得到了答案

保存

 const CGFloat *components = CGColorGetComponents(pColor.CGColor); NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setFloat:components[0] forKey:@"cr"]; [prefs setFloat:components[1] forKey:@"cg"]; [prefs setFloat:components[2] forKey:@"cb"]; [prefs setFloat:components[3] forKey:@"ca"]; 

加载

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; UIColor* tColor = [UIColor colorWithRed:[prefs floatForKey:@"cr"] green:[prefs floatForKey:@"cg"] blue:[prefs floatForKey:@"cb"] alpha:[prefs floatForKey:@"ca"]]; 

感谢Erica的UIColor类别 。 我真的不喜欢在喜好中保存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]; } 

Swift 3, UserDefaults扩展

 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)'") 

这个答案是基于以前的答案 。 它更新为Swift 3。

我需要在用户默认值中存储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) UserDefaults.standard.synchronize() } } } 

编辑2:我似乎find了答案 。 查看Erica Sadun关于扩展UIColor的文章。

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

下面是一些代码来看看:

将对象保存到NSUserDefaults中:

  NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults]; [userDefaults setObject:someColorObject forKey:@"myColor"]; 

从NSUserDefaults读取一个对象:

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