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