我制作了一个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];
答案 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];
}
希望有所帮助