2013-06-23 2 views
0

У меня есть ViewController с парование viewDidLoad:UIPickerView не выбирает правильную строку

- (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 can't autoselect last row when compiled under Xcode 4.5.2 & iOS 6

+0

эй человек, которого вы сохранили много времени! после того, как много ответов попробовало это работает наконец ....... !!!!! –

0

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

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

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

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

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

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

, но я хочу, чтобы выбрать последнюю строку. Итак, когда у меня есть 9 элементов в массиве, с row = 8, он должен выбрать последнюю строку, правильно? - Но он всегда выбирает вторую последнюю строку с row = 8 :-( – BennoDual

+0

вы уверены, что ваш номерOfRowsInComponent вернет правильный номер, а titleForRow вернет правильный заголовок. Не могу понять, почему это пошло не так. –

0

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

+0

как ответ от calvinBhai, я знаю, что массивы отмечены от 0. Итак, когда у меня есть 9 элементов, он должен выбрать последнюю строку, когда я использую индекс 8 для строки. Но он выбирает вторую последнюю строку :-( – BennoDual