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, так что средство выбора выбирает последнюю строку перед.