Ios UILabel背景色默认值
我制作了一个RGB滑块,我想将两个标签的滑块值和背景色保存为NSUserDefault。保存sliderValue很好,但是对于标签背景色,我的代码不起作用。我的代码写对了吗 信息:label1的背景色应保存在NSUserDefaults中 这条线Ios UILabel背景色默认值,ios,uilabel,nsuserdefaults,uicolor,Ios,Uilabel,Nsuserdefaults,Uicolor,我制作了一个RGB滑块,我想将两个标签的滑块值和背景色保存为NSUserDefault。保存sliderValue很好,但是对于标签背景色,我的代码不起作用。我的代码写对了吗 信息:label1的背景色应保存在NSUserDefaults中 这条线 NSString* label1 = self.label1.backgroundColor; 正在产生此错误 使用UIColor类型的表达式初始化NSString的指针类型不兼容 这条线呢 [defaults setObject:label1 f
NSString* label1 = self.label1.backgroundColor;
正在产生此错误
使用UIColor类型的表达式初始化NSString的指针类型不兼容
这条线呢
[defaults setObject:label1 forKey:@"label1"];
正在产生此错误
'label1'的局部声明隐藏实例变量
这是我的.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
类别以方便保存方面有着出色的著作。我建议将颜色转换为十六进制字符串以保存,并将十六进制字符串转换回颜色以应用为背景色
要解决您的第一个问题:
NSString* label1 = self.label1.backgroundColor;
您正在尝试创建NSString类型的变量,并为其分配UIColor对象。您需要确保您的变量与您试图分配给它的对象的类型相同。应该是:
UIColor *label1Color = self.label1.backgroundColor;
请注意,我不仅更改了变量的类型,还更改了它的名称。这一点很重要,有几个原因。通常,您希望以一种方式命名变量,使您在读取变量时能够清楚地存储它们,并且label1
作为变量名听起来像标签,而不是颜色
这让我想到了你的第二个错误。这里的问题是,您为颜色变量指定了与标签相同的名称,并且由于在此范围内有两个名为label1
的变量可见,编译器会抱怨。正如我在上面的代码中所做的那样更改变量名也可以解决这个问题,但是代码中还有一个问题
无法将UIColor对象直接保存到NSUserDefault。您需要将颜色转换为可存储在其中的一种数据类型,如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。。
错误1:您已经有一个全局属性:UILabel*label1,并且您创建了另一个本地属性NSString*label1-->重命名您的属性
错误2:相同的问题您可以通过将浮点值转换为UIColor,然后转换为最终为字符串的十六进制代码来保存它,并且可以将字符串值存储在NSUserDefaults中。 从UIColor转换为字符串(hexcode)以及从UIColor转换为字符串(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;
}
然后,您可以使用此函数通过传递hexcode(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];
}
希望能有帮助