#iphone #uipickerview #nsuserdefaults
#iPhone #uipickerview #nsuserdefaults
Вопрос:
Есть UIPickerView
с двумя строками. Пытаюсь сохранить значение каждой строки в NSUserDefaults
. Раньше не использовался NSUserDefaults
. Вот мой код:
-(void)viewWillAppear: (BOOL) animated {
NSUserDefaults *defaultsPicker = [NSUserDefaults standardUserDefaults];
picker = [defaultsPicker objectForKey:@"picker"] ;
}
- (void)viewDidLoad {
NSArray *ar1 = [NSArray array];
for (int i = 150; i <= 210; i )
ar1 = [ar1 arrayByAddingObject:[NSString stringWithFormat:@"%d",i]];
[ar1 retain];
self.array1 = ar1;
NSArray *ar2 = [NSArray array];
for (int j = 40; j <= 130; j )
ar2 = [ar2 arrayByAddingObject:[NSString stringWithFormat:@"%d",j]];
[ar2 retain];
self.array2 = ar2;
[super viewDidLoad];
}
И NSUserDefaults находится в IBAction
-(IBAction)calculate {
NSUserDefaults *defaultsPicker = [NSUserDefaults standardUserDefaults];
[defaultsPicker setObject:[NSNumber numberWithInt:[picker selectedRowInComponent:0 ]] forKey:@"picker"];
[defaultsPicker synchronize];
//bla bla
}
Когда я нажимаю кнопку, приложение выходит из строя, и журнал:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber selectedRowInComponent:]: unrecognized selector sent to instance 0x690df40'
Обновить
#pragma mark -
#pragma mark Picker Data Source Methods
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == secondArrayComponent) {
return [self.array2 count];
}else {
return [self.array1 count];
}
}
#pragma mark Picker Delegate Methods
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == secondArrayComponent) {
return [self.array2 objectAtIndex:row];
}else {
return [self.array1 objectAtIndex:row];
}
}
Ответ №1:
В вашем - (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
методе делегирования добавьте следующий код, и он должен сохраниться в NSUserDefaults
Обновить
#pragma mark -
#pragma mark Picker Data Source Methods
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == secondArrayComponent) {
return [self.array2 count];
}else {
return [self.array1 count];
}
}
#pragma mark Picker Delegate Methods
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == secondArrayComponent) {
return [self.array2 objectAtIndex:row];
}else {
return [self.array1 objectAtIndex:row];
}
}
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSInteger selectedRow = [thePickerView selectedRowInComponent:0];
[[NSUserDefaults standardUserDefaults] setInteger:selectedRow forKey:@"picker"];
}
Этого должно хватить, если вы убедитесь, что установили делегат вашего UIPickerView как «self» в interface builder или в вашем коде. Также в вашем файле .h убедитесь, что у вас есть <UIPickerViewDelegate>
ОБНОВЛЕНИЕ 2 Чтобы проверить, были ли сохранены ваши NSUserDefaults, используйте этот фрагмент кода в -(IBAction) по вашему выбору
NSInteger pickerRow = [[NSUserDefaults standardUserDefaults] integerForKey:@"picker"];
NSLog(@"%i", pickerRow);
Комментарии:
1. хорошо отредактировано. Вы должны иметь возможность просто скопировать и вставить это, и это должно сработать
2. Не работает. Нужен ли мне мой старый код в viewDidLoad и в -(IBAction) calculate?
3. вам все еще нужен код в вашем viewDidLoad да, но не вычисление -(IBAction). Вместо этого оно будет сохраняться в ваших NSUserDefaults каждый раз, когда вы приводите значение UIPickerView к значению. Как вы проверяете, сохраняются ли ваши NSUserDefaults? Я отредактировал приведенный выше код, чтобы проверить, было ли сохранено значение.
4. Как я могу добавить вторую строку в NSUserDefaults? Теперь работает только первая строка.