UIPickerView не выбирает правильную строку

У меня есть ViewController с парой viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    model = [GlobalDataModel sharedDataModel];

    programTypes = @[@"Gewichtsreduktion", @"Verdauungs-/Stoffwechselprobleme", @"Energielosigkeit, Müdigkeit",
                     @"Stress, Burn-out", @"Unruhe, Schlaflosigkeit", @"Immunsystem, Hautprobleme", @"Sport - Muskelaufbau", @"Sport - Ausdauersport", @"Sport - Leistungssport"];

    int row = 8; //[model.infoDictionary[@"programmtyp"] intValue];
    [programTypePicker selectRow:row inComponent:0 animated:NO];
}

и это методы делегата для UIPickerView:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {       
    return programTypes.count;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
            forComponent:(NSInteger)component {
    return programTypes[row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    model.infoDictionary[@"programmtyp"] = [NSString stringWithFormat:@"%ld",(long)row];
}

Проблема в том, что в viewDidLoad, когда я устанавливаю row = 8, он всегда будет выбирать не последний ряд, а второй-последний ряд (вместо "Sport - Leistungssport" он выбирает "Sport - Ausdauersport"). Когда я использую строку меньше 8, она будет работать правильно.

Сомоне может мне помочь, что я делаю не так? - Спасибо.

3 ответа

Решение

Это ошибка в iOS 6 с авторазмещением. Единственные обходные пути, которые я мог выяснить, были отключить автоматическое расположение или установить выбор средства выбора в viewDidAppear: вместо viewDidLoad или viewWillAppear:.

См. Следующее для получения дополнительной информации: UIPickerView не может автоматически выбирать последнюю строку при компиляции в Xcode 4.5.2 и iOS 6

Из того, что я мог понять,

у вас есть 9 объектов в вашем массиве.

Массивы индексируются от 0 до n-1 (в вашем случае от 0 до 8, а не от 1 до 9)

выбирая правильную строку, вы не устанавливаете правильный индекс.

Если вы хотите, чтобы он выбирал второй последний, даже если количество строк / объектов в массиве варьируется, просто установите его на

int row = [programTypes count]-2; //[programTypes count]-1 is the last row.

В вашем фрагменте кода переменная programTypes.count возвращает count как 9, а вы выбрали selectedRow как 8, так что средство выбора выбирает последнюю строку перед.

Другие вопросы по тегам