2015-02-27 4 views
0

Я сделал ползунок RGB, и я хочу сохранить значение ползунка и цвет фона двух меток в NSUserDefaults. Сохранение слайдераValue отлично работает, но для цвета фона метки мой код не работает. Я правильно написал свой код?UILabel background Цвет NSUserDefaults

Информация: цвет фона с метки1 должен быть сохранен в NSUserDefaults.

Эта линия

NSString* label1 = self.label1.backgroundColor; 

производит эту ошибку

несовместимые типы указателей intializing NSString с выражением типа UIColor

и эта линия

[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

Для решения вашей первой проблемы:

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 для преобразования значения обратно в UIColor из NSData. Этого можно достичь с помощью:

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

UIColor не может быть сохранен в NSUserDefaults. У Erica Sadun есть отличная запись о создании категории UIColor, чтобы обеспечить экономию. Я бы рекомендовал преобразовать цвет в шестую строку для сохранения и преобразовать шестнадцатеричный strubg обратно в цвет, который будет применяться в качестве фона.

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

0

Файлы списка свойств могут хранить только основные типы данных и не могут содержать пользовательские объекты. Вам нужно преобразовать объект в объект NSData, если вы хотите, чтобы он был записан на plist. Вы можете сделать это с помощью NSKeyedArchiver, который будет кодировать объект, который соответствует протоколу NSCoding, в объект NSData.

пожалуйста, прочитайте этот блок, чтобы иметь лучшее понимание PLIST .. Link

0

ОШИБКА 1: у вас уже есть глобальное свойство: UILabel * Label1 и создать другое локальное свойство NSString * label1 -> переименовать свойства

ОШИБКА 2: Та же проблема

0

вы можете сохранить его с помощью преобразования значений с плавающей запятой в UIColor, а затем к hexcode, которая в конечном счете, строка и вы можете хранить строковые значения в 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; 
} 

Затем вы можете использовать эту функцию, чтобы получить UIColor для этикетки, передавая hexcode, который является строковым значением из вашего 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]; 
} 

Надеюсь, это поможет

Смежные вопросы