2010-03-04 5 views
2

J'essaie d'utiliser des couleurs non-standard (c'est-à-dire non pas UIColor blueColor, mais une couleur bleue plus foncée, un vert plus foncé, rouge ... etc ...) et quand j'essaie de enregistrer l'objet UIColor sélectionné par l'utilisateur sur UserDefaults, il échoue. Ci-dessous le code que j'utilise pour créer les couleurs personnalisées, suivi du code pour enregistrer les objets UIColor dans UserDefaults.Comment enregistrer des couleurs personnalisées sur UserDefaults

Toute aide serait appréciée.

Merci!

// créer la couleur personnalisée

UIColor *selectedColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.0 alpha:1.0]; 

// enregistrer la couleur utilisateur par défaut de

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
// archive it into a data object 

/*** Fails on this next line ***/  
NSData *dataColor = [NSKeyedArchiver archivedDataWithRootObject: selectedColor]; 

// write the data into the user defaults 
[prefs setObject: dataColor forKey:colorKey]; 

[prefs synchronize]; 

Répondre

5

Le problème ici est que UIColor est non conforme « de codage clé » (je ne suis pas sûr le terme correct), vous devriez avoir une erreur comme ceci:

*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value 

Il ne peut pas être enregistré dans NSUSerDefault s, vous devez les enregistrer en utilisant un NSKeyArchiver ou convertir les valeurs de couleur en quelque chose compatible avec le code-clé. Par exemple, j'ai suivi l'approche NSStringFromCGRect en utilisant des catégories. Ceci est mon code:

UIColorAdditions.h

#import <Foundation/Foundation.h> 


@interface UIColor (UIColorAdditions) 

+ (NSString *)stringFromUIColor:(UIColor *)color; 

@end 

@interface NSString (UIColorAdditions) 

+ (UIColor *)colorFromNSString:(NSString *)string; 

@end 

UIColorAdditions.m

#import "UIColorAdditions.h" 

@implementation UIColor (UIColorAdditions) 
+ (NSString *)stringFromUIColor:(UIColor *)color { 
    return [NSString stringWithFormat:@"%@", color ]; 
} 
@end 

@implementation NSString (UIColorAdditions) 
+ (UIColor*)colorFromNSString:(NSString *)string { 
    // The string should be something like "UIDeviceRGBColorSpace 0.5 0 0.25 1 
    NSArray *values = [string componentsSeparatedByString:@" "]; 
    CGFloat red = [[values objectAtIndex:1] floatValue]; 
    CGFloat green = [[values objectAtIndex:2] floatValue]; 
    CGFloat blue = [[values objectAtIndex:3] floatValue]; 
    CGFloat alpha = [[values objectAtIndex:4] floatValue]; 
    UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 

    return color; 
} 
@end 

Un exemple d'utilisation:

NSString *strColor = [UIColor stringFromUIColor:[UIColor colorWithRed:0.5 green:0 blue:0.25 alpha:1.0]]; 
[[NSUserDefaults standardUserDefaults] setObject:strColor forKey:kViewBgColorKey]; 

Il y a plusieurs solutions, (de meilleurs) , Je viens de poster le mien.

Questions connexes