Как сохранить пользовательский цвет в UserDefaults - PullRequest
2 голосов
/ 04 марта 2010

Я пытаюсь использовать некоторые нестандартные цвета (например, не UIColor blueColor, а темно-синий цвет, темно-зеленый, красный ... и т. Д.), И когда я пытаюсь сохранить выбранный пользователем объект UIColor в UserDefaults, это сбой. Ниже приведен код, который я использую для создания пользовательских цветов, а затем код для сохранения объектов UIColor в 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];

1 Ответ

5 голосов
/ 19 января 2011

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

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

Он не может быть сохранен в NSUSerDefaults, вам нужно сохранить их с помощью 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];

Есть несколько решений, (лучшие), я только что опубликовал свое.

...