UILabel背景颜色NSUserDefaults

时间:2015-02-27 12:18:22

标签: ios uilabel nsuserdefaults uicolor

我制作了一个RGB滑块,我想将两个标签的滑块值和背景颜色保存到NSUserDefaults。保存sliderValue工作正常,但对于标签背景颜色,我的代码不起作用。我是否正确编写了代码?

信息:label1的背景颜色应保存在NSUserDefaults中。

这一行

NSString* label1 = self.label1.backgroundColor;

产生此错误

  

不兼容的指针类型,使用UIColor类型的表达式初始化NSString

这一行

[defaults setObject:label1 forKey:@"label1"];

产生此错误

  

本地声明'label1'hides实例变量

这是我的.m文件:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

self.label1.backgroundColor =[defaults objectForKey:@"label1"];
self.labelRot.text = [defaults objectForKey:@"labelRot"];
self.labelBlau.text = [defaults objectForKey:@"labelBlau"];
self.labelGruen.text = [defaults objectForKey:@"labelGruen"];

self.sliderRot.value = [defaults floatForKey:@"sliderRot"];
self.sliderBlau.value = [defaults floatForKey:@"sliderBlau"];
self.sliderGruenn.value = [defaults floatForKey:@"sliderGruenn"];


//labelRot.text = [NSString stringWithFormat:@"%0.0f", _sliderRot.value];
//labelGruen.text = [NSString stringWithFormat:@"%0.0f", _sliderGruenn.value];
//labelBlau.text = [NSString stringWithFormat:@"%0.0f", _sliderBlau.value];

// Do any additional setup after loading the view, typically from a nib.
- (IBAction)red:(id)sender {

if (sender == _sliderRot) {
    _labelRot.text = [NSString stringWithFormat:@"%0.0f", _sliderRot.value];
    [self farbeWechseln];
}

}- (IBAction)green:(id)sender {

if (sender == _sliderGruenn) {
    _labelGruen.text = [NSString stringWithFormat:@"%0.0f", _sliderGruenn.value];
    [self farbeWechseln];
}

- (IBAction)blue:(id)sender {

if (sender == _sliderBlau) {
    _labelBlau.text = [NSString stringWithFormat:@"%0.0f", _sliderBlau.value];
    [self farbeWechseln];
}


- (IBAction)farbe:(id)sender {

[self farbeWechseln];



- (void)farbeWechseln {

    [label1 setBackgroundColor:[UIColor colorWithRed:_sliderRot.value/255 green:_sliderGruenn.value/255 blue:_sliderBlau.value/255 alpha:1.0]];
    [label2 setBackgroundColor:[UIColor colorWithRed:_sliderRot.value/255 green:_sliderGruenn.value/255 blue:_sliderBlau.value/255 alpha:1.0]];
}

- (void)speichernDefaults {

// hier werden die UserDefaults gespeichert

NSString* label1 = self.label1.backgroundColor; //HERE IS MY FIRST ERROR = incompatible pointer types intializing NSString with an expression of type UIColor
NSString *labelRot = self.labelRot.text;
NSString *labelBlau = self.labelBlau.text;
NSString *labelGruen = self.labelGruen.text;



float sliderRot = self.sliderRot.value;
float sliderGruenn = self.sliderGruenn.value;
float sliderBlau = self.sliderRot.value;


NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:label1 forKey:@"label1"]; //HERE IS MY SECOND ERROR = local declaration of ´label1´hides instance variable

[defaults setObject:labelRot forKey:@"labelRot"];
[defaults setObject:labelBlau forKey:@"labelBlau"];
[defaults setObject:labelGruen forKey:@"labelGruen"];


[defaults setFloat:sliderRot forKey:@"sliderRot"];
[defaults setFloat:sliderGruenn forKey:@"sliderGruenn"];
[defaults setFloat:sliderBlau forKey:@"sliderBlau"];

// dieser Befehl ist für sofortiges Speichern der Userdefaults
    [defaults synchronize];

5 个答案:

答案 0 :(得分:0)

UIColor无法直接保存到NSUserDefaults。 Erica Sadun撰写了一篇关于创建UIColor类别以便轻松保存的精彩文章。我建议将颜色转换为十六进制字符串以保存并将十六进制strubg转换回颜色以应用为背景颜色。

http://arstechnica.com/apple/2009/02/iphone-development-accessing-uicolor-components/

答案 1 :(得分:0)

解决您的第一个问题:

NSString* label1 = self.label1.backgroundColor;

您尝试创建NSString类型的变量并为其分配UIColor对象。您需要确保您的变量与您尝试分配给它的对象的类型相同。它应该是:

UIColor *label1Color = self.label1.backgroundColor;

请注意,我并不只是更改变量的类型,而是更改其名称。这有几个原因很重要。通常,您希望以一种方式命名变量,使它们在您阅读时为您存储清晰,并且label1作为变量名称听起来像标签,而不是颜色。

这导致我出现第二个错误。这里的问题是你给你的颜色变量和你的标签同名,并且由于你在这个范围内有两个名为label1的变量,编译器会抱怨。正如我在上面的代码中所做的那样更改变量名称也可以解决此问题,但您的代码还有一个问题。

您无法将UIColor对象直接保存到NSUserDefaults。您需要将颜色转换为可以存储在其中的数据类型之一,例如NSData,可以这样做:

NSData *dataFromLabel1Color = [NSKeyedArchiver archivedDataWithRootObject:label1Color];
[defaults setObject:dataFromLabel1Color forKey:@"label1Color"];

您还必须修改从NSUserDefaults中恢复颜色的方式,以便将值从NSData转换回UIColor。这可以通过以下方式实现:

UIColor *label1Color = [NSKeyedUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"label1Color"]];
self.label1.backgroundColor = label1Color;

答案 2 :(得分:0)

属性列表文件只能存储基本数据类型,不能包含自定义对象。如果要将对象写入plist,则需要将对象转换为NSData对象。您可以使用NSKeyedArchiver执行此操作,NSKeyedArchiver会将符合NSCoding协议的对象编码为NSData对象。

请阅读此块以更好地了解plist .. Link

答案 3 :(得分:0)

错误1:您已经拥有全局属性:UILabel * label1并且您创建了另一个本地属性NSString * label1 - >重命名您的属性

错误2:同样的问题

答案 4 :(得分:0)

您可以通过将浮点值转换为UIColor然后转换为十六进制代码来保存它,该十六进制代码最终是一个字符串,您可以在NSUserDefaults中存储字符串值。 从UIColor转换为String(十六进制代码)的代码,反之亦然

-(NSString*)getHexcode::(UIColor *)mycolor {
    const CGFloat *components = CGColorGetComponents(mycolor.CGColor);
    CGFloat r = components[0];
    CGFloat g = components[1];
    CGFloat b = components[2];

    NSString *colorHexCode = [NSString stringWithFormat:@"#%02lX%02lX%02lX", (long)(r * 255.0), (long)(g * 255.0), (long)(b * 255.0)];

    return colorHexCode;
}

然后您可以使用此函数通过传递十六进制代码来获取标签的UIColor,这是NSUserdefaults中的字符串值

-(UIColor *)colorFromHexString:(NSString *)hexString {
    unsigned rgbValue = 0;

    if([hexString isEqual:@""])
    {
        hexString=defaultGreenColor;
    }

    if([hexString isKindOfClass:[NSNull class]])
    {
        hexString=defaultGreenColor;
    }

    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    [scanner setScanLocation:1]; // bypass '#' character
    [scanner scanHexInt:&rgbValue];

    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

希望有所帮助