Salvando o UIColor e carregando de NSUserDefaults

Qual é a maneira mais fácil de salvar um UIColor em NSUserDefaults e depois recuperá-lo?

Com a resposta aceita , você acabará rapidamente com muitos arquivos NSKeyed e desarquivamentos em todo o seu código. Uma solução mais limpa é estender UserDefaults. Isso é exatamente o que as extensões são para; Os UserDefaults provavelmente não conhecem o UIColor, pois o UIKit e o Foundation são estruturas 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") 

Isso também pode ser feito em Objective-C com uma categoria.

Eu adicionei o arquivo Swift como uma essência aqui .

Uma maneira de fazer isso é arquivá-lo (como no NSColor, embora eu não tenha testado isso):

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

E para recuperá-lo:

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

Eu tenho a resposta sozinho

Salve 

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

Obrigado pela categoria UIColor de Erica . Eu realmente não gostei de salvar 4 carros alegóricos nas preferências, e só queria uma única input.

Então, usando a categoria UIColor de Erica, consegui converter a cor RGB para / de um NSString que pode ser salvo nas preferências.

 // 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

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

Exemplo 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 resposta é baseada em uma resposta anterior . Ele é atualizado para o Swift 3.

Eu precisava armazenar uma matriz de objects UIColor nos Padrões do Usuário. Idéia, como afirmado em outras respostas, é converter UIColor para Data e salvar esses dados. Eu fiz extensão no 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) } } } 

Edit 2: parece que encontrei a resposta . Confira o artigo de Erica Sadun sobre como estender o UIColor.

Edit: Este código não parece funcionar para um object UIColor. Não tenho certeza porque …

Aqui está algum código para dar uma olhada:

Salvando um object em NSUserDefaults:

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

Lendo um object de NSUserDefaults:

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