Запазването на стойност на UISlider в масив не работи

всъщност се опитвам да запазя потребителските настройки в plist, за да имам достъп до тях отвсякъде. Но когато запазвам стойността на UISlider в моя масив, винаги получавам съобщението

Изпращане на 'float' към параметър от несъвместим тип 'id';

масивът изглежда така:

NSArray *value = [[NSArray alloc] initWithObjects: [theGradeSlider value], [theBackgroundSound isOn], [theButtonSound isOn], nil];

Опитах и ​​с MSMutableArray, но и това не работи....


ДРУГО РЕШЕНИЕ

Опитах го знам с NSUserDefaults и работи.

за да запазите настройките (трябва да бъдат вмъкнати в viewDidUnload или viewDidDiassappear):

NSUserDefaults *settings = [[NSUserDefaults alloc] initWithUser:@"User"];

[settings setFloat:theGradeSlider.value forKey:@"theGradeSlider"];
[settings setBool:theBackgroundSound.on forKey:@"theBackgroundSound"];
[settings setBool:theButtonSound.on forKey:@"theButtonSound"];
[settings synchronize];

за зареждане на настройките (трябва да бъдат вмъкнати във viewDidLoad или ViewDidAppear):

NSUserDefaults *settings = [[NSUserDefaults alloc] initWithUser:@"User"];

theGradeSlider.value = [settings floatForKey:@"theGradeSlider"];
theBackgroundSound.on = [settings boolForKey:@"theBackgroundSound"];
theButtonSound.on = [settings boolForKey:@"theButtonSound"];

person Alex Cio    schedule 07.06.2012    source източник


Отговори (3)


Проблемът тук е, че стойностите, които поставяте в масива, не са обекти. За да направите това (въпреки че бих предложил речник вместо масив), бихте искали да създадете NSNumber обекта за всеки.

NSNumber *sliderValueObj = [NSNumber numberWithFloat: [theGradeSlader value]];
NSNumber *backgroundSoundObj = [NSNumber numberWithBool: [theBackgroundSound isOn]];
NSNumber *buttonSoundObj = [NSNumber numberWithBool: [theButtonSound isOn]];

NSArray *value = [[NSArray alloc] initWithObjects: sliderValueObj,backgroundSoundObj,buttonSoundObj, nil];

or

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys: sliderValueObj, @"slider",
                      backgroundSoundObj, @"backgroundSound",
                      buttonSoundObj, @"buttonSound",
                      nil];

За по-добра форма използвайте съдържание за ключовете.

person gaige    schedule 07.06.2012
comment
Току-що видях урок, където параметърът на текстово поле и средство за избор на дата бяха предадени на масив по начина, по който го направих, и всичко работи добре. Изглежда, че работи без никакви грешки, благодаря - person Alex Cio; 08.06.2012
comment
Разбира се, параметрите на текстовите полета и инструментите за избор на дата са обекти, но value на плъзгача е плаващ елемент. Ето защо няма да работи за вашия пример по-горе. - person gaige; 08.06.2012

Това е вярно, не можете да съхранявате примитиви в масив. Вероятно е по-добре да ги запазите като NSNumber в NSUserDefaults. За това е.

person jonusx    schedule 07.06.2012

Трябва да използвате класа NSNumber, за да съхранявате вашите стойности в масива. По-специално методите са -numberWithFloat: и -numberWithBool.

NSArray *value = [[NSArray alloc] 
         initWithObjects:[NSNumber numberWithFloat:[theGradeSlider value]], 
                         [NSNumber numberWithBool:[theBackgroundSound isOn]], 
                         [NSNumber numberWithBool:[theButtonSound isOn]], nil];
person skram    schedule 07.06.2012