2010-03-04 3 views
2

Я пытаюсь использовать некоторые нестандартные цвета (то есть не UIColor blueColor, а более темный синий цвет, более темный зеленый, красный ... и т. Д.), И когда я пытаюсь сохранить выбранный пользователем объект UIColor в UserDefaults, он не работает. Ниже приведен код, который я использую для создания пользовательских цветов, а затем код для сохранения объектов UIColor в UserDefaults.Как сохранить пользовательский цвет в UserDefaults

Любая помощь будет оценена по достоинству.

Спасибо!

// создать собственный цвет

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

// сохранить цвет пользователя по умолчанию

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

ответ

5

Проблема здесь состоит в том, что UIColor не «ключ-кодирования» совместимый (я не уверены в правильном перспективе), вы должны иметь ошибку вида:

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

это не может быть сохранен в NSUSerDefault s, вам необходимо сохранить их с помощью NSKeyArchiver или преобразовать значения цвета в соответствующий код. Например, я придерживался подхода NSStringFromCGRect, используя категории. Это мой код:

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 

Пример использования:

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

Есть несколько решений, (лучше из них) , Я только что написал мой.