UILabel 背景色 NSUserDefaults
UILabel background Color NSUserDefaults
我做了一个RGB滑块,我想把两个标签的滑块值和背景颜色保存到NSUserDefaults。保存 sliderValue 工作正常,但对于标签背景颜色,我的代码不起作用。我的代码写对了吗?
信息:label1 的背景颜色应该保存在 NSUserDefaults 中。
这一行
NSString* label1 = self.label1.backgroundColor;
正在产生此错误
incompatible pointer types intializing NSString with an expression of type UIColor
还有这一行
[defaults setObject:label1 forKey:@"label1"];
正在产生此错误
local declaration of ´label1´hides instance variable
这是我的 .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];
一个UIColor
不能直接保存到NSUserDefaults
。 Erica Sadun 有一篇关于创建 UIColor
类别以便于保存的精彩文章。我建议将颜色转换为十六进制字符串进行保存,并将十六进制 strubg 转换回颜色以用作背景色。
http://arstechnica.com/apple/2009/02/iphone-development-accessing-uicolor-components/
解决您的第一个问题:
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;
属性列表文件只能存储基本数据类型,不能包含自定义对象。如果要将对象写入 plist,则需要将对象转换为 NSData 对象。你可以使用 NSKeyedArchiver 来做到这一点,它会将符合 NSCoding 协议的对象编码为 NSData 对象。
请阅读此块以更好地了解 plist..
Link
错误 1:您已经有一个全局 属性: UILabel *label1 并且您创建了另一个本地 属性 NSString *label1 --> 重命名您的属性
错误 2:同样的问题
您可以通过将浮点值转换为 UIColor 然后转换为最终为字符串的十六进制代码来保存它,并且您可以将字符串值存储在 NSUserDefaults 中。
从 UIColor 到 String(hexcode) 的转换代码,反之亦然
-(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;
}
然后您可以使用此函数通过传递 NSUserdefaults 中的字符串值的十六进制代码来为您的标签获取 UIColor
-(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];
}
希望对您有所帮助
我做了一个RGB滑块,我想把两个标签的滑块值和背景颜色保存到NSUserDefaults。保存 sliderValue 工作正常,但对于标签背景颜色,我的代码不起作用。我的代码写对了吗?
信息:label1 的背景颜色应该保存在 NSUserDefaults 中。
这一行
NSString* label1 = self.label1.backgroundColor;
正在产生此错误
incompatible pointer types intializing NSString with an expression of type UIColor
还有这一行
[defaults setObject:label1 forKey:@"label1"];
正在产生此错误
local declaration of ´label1´hides instance variable
这是我的 .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];
一个UIColor
不能直接保存到NSUserDefaults
。 Erica Sadun 有一篇关于创建 UIColor
类别以便于保存的精彩文章。我建议将颜色转换为十六进制字符串进行保存,并将十六进制 strubg 转换回颜色以用作背景色。
http://arstechnica.com/apple/2009/02/iphone-development-accessing-uicolor-components/
解决您的第一个问题:
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;
属性列表文件只能存储基本数据类型,不能包含自定义对象。如果要将对象写入 plist,则需要将对象转换为 NSData 对象。你可以使用 NSKeyedArchiver 来做到这一点,它会将符合 NSCoding 协议的对象编码为 NSData 对象。
请阅读此块以更好地了解 plist.. Link
错误 1:您已经有一个全局 属性: UILabel *label1 并且您创建了另一个本地 属性 NSString *label1 --> 重命名您的属性
错误 2:同样的问题
您可以通过将浮点值转换为 UIColor 然后转换为最终为字符串的十六进制代码来保存它,并且您可以将字符串值存储在 NSUserDefaults 中。 从 UIColor 到 String(hexcode) 的转换代码,反之亦然
-(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;
}
然后您可以使用此函数通过传递 NSUserdefaults 中的字符串值的十六进制代码来为您的标签获取 UIColor
-(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];
}
希望对您有所帮助