UIPickerView внутри пользовательского UITableViewCell

У меня есть пользовательский UITableViewCell, где у меня есть UIPickerView внутри него. Для управления этим я создал подкласс, в котором реализовал методы делегата и источника данных UIPickerView. Когда cellForRowAtIndexPath я реализовал так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    if (indexPath.section==2) {

        PickerCellTableViewCell *cell2=[tableView dequeueReusableCellWithIdentifier:@"pickerCell" forIndexPath:indexPath];
        cell2.cellPickerInputArray=self.pickerArray;

        return cell2;

    }else{

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"normalCell" forIndexPath:indexPath];

        cell.textLabel.text=[[self.inputArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

        return cell;

    }
}

в файле подкласса.m у меня есть следующее:

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

        return [self.cellPickerInputArray count];

}

У меня есть следующая проблема: если я оставлю это так, он падает, и консоль дает мне это:

Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (7), должно быть равно количеству строк, содержащихся в этом разделе до обновления (0), плюс или минус число строк, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 удалено).'

Однако, если я изменю numberOfRowsInComponent: чтобы вернуть фактическое количество строк (7 в этом примере), все работает довольно хорошо.

Я пытался, но я не вижу, чтобы найти проблему / решение. Любая помощь будет оценена. Заранее спасибо!

Редактировать! Как предложено @meda, я NSLoged NSLog(@"PickerInputArray count"%@",[self.cellPickerInputArray число]); внутри метода pickerView numberOfRowsInComponent

Вот:

2014-03-30 21:04:54.756 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.757 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.758 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.758 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.762 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.765 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.767 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.770 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.771 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.771 TestPickerOnTable[3498:60b] PickerInputArray count7

2 ответа

Решение

Из ваших журналов, кажется, что количество элементов в вашем UIPicker изменения источника данных.

Когда вы добавляете или удаляете элемент из self.inputArray всегда проверяйте, что вы перезагрузили компоненты, иначе вы получите недопустимую ошибку обновления.

перезагрузить сборщик:

[_yourPicker reloadAllComponents]

Вы задали этот вопрос два года назад, так что вы, вероятно, уже решили его, но проблема в том, что в cellForRowAtIndexPath вы создаете два разных вида клеток в зависимости от значения IndexPath.section,

if indexPath.section == 2Ваша (пользовательская) ячейка имеет cellPickerInputArray, В противном случае ваша (нормальная) клетка не имеет этого, поэтому ваш numberOfRowsInComponent не удается, потому что теперь есть массив для получения количества.

Чтобы это исправить, измените numberOfRowsInComponent иметь то же самое if..then..else состав:

if (indexPath.section==2) {
  return [self.cellPickerInputArray count];
} else {
  return <some appropriate value>;
}
Другие вопросы по тегам