Не удается сохранить значение UIPickerView в NSUserDefaults

#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? Теперь работает только первая строка.