Guardar UIColor y cargar desde NSUserDefaults

¿Cuál es la forma más fácil de guardar un UIColor en NSUserDefaults y luego recuperarlo?

Con la respuesta aceptada , rápidamente terminarás con muchos archivos y anarchivos de NSKeyed en todo tu código. Una solución más limpia es extender UserDefaults. Esto es exactamente para lo que son las extensiones; UserDefaults probablemente no sabe acerca de UIColor tal como es, porque UIKit y Foundation son marcos diferentes.

Rápido

 extension UserDefaults { 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(_ value: UIColor?, forKey key: String) { var colorData: Data? if let color = value { colorData = NSKeyedArchiver.archivedData(withRootObject: color) } set(colorData, forKey: key) } } 

Uso

 UserDefaults.standard.set(UIColor.white, forKey: "white") let whiteColor = UserDefaults.standard.color(forKey: "white") 

Esto también se puede hacer en Objective-C con una categoría.

He agregado el archivo Swift como esencia aquí .

Una forma de hacerlo podría ser archivarlo (como con NSColor, aunque no lo he probado):

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

Y para recuperarlo:

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

Tengo la respuesta por mi cuenta

Salvar

 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"]; 

Carga

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

Gracias por la categoría UIColor de Erica . Realmente no me gustó guardar 4 flotadores en las preferencias, y solo quería una sola entrada.

Entonces, usando la categoría UIColor de Erica, pude convertir el color RGB a / desde un NSString que se puede guardar en las preferencias.

 // 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, extensión 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) } } 

Ejemplo de uso

 let colorKey = "favoriteColor" UserDefaults.standard.setColor(UIColor.red, forKey: colorKey) let favoriteColor = UserDefaults.standard.color(forKey: colorKey) print("favoriteColor is red: '\(favoriteColor == UIColor.red)'") 

Esta respuesta se basa en una respuesta previa . Se actualiza para Swift 3.

Necesitaba almacenar una matriz de objetos UIColor en Predeterminados del usuario. Idea, como se indica en otras respuestas, es convertir UIColor en Datos y guardar esos datos. He hecho extensión en 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 } } 

Uso:

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

Editar 2: parece que encontré la respuesta . Echa un vistazo al artículo de Erica Sadun sobre la extensión de UIColor.

Editar: Este código no parece funcionar para un objeto UIColor. No estoy seguro de por qué …

Aquí hay un código para ver:

Guardar un objeto en NSUserDefaults:

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

Leer un objeto de NSUserDefaults:

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