Сохранение значения 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