2

我正在尝试使用一些非标准颜色(即不是 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];
4

1 回答 1

5

这里的问题是 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];

有多种解决方案,(更好的),我刚刚发布了我的。

于 2011-01-19T15:11:05.330 回答