Заставить UITableView вызвать cellForRowAtIndexPath: для всех ячеек - PullRequest
6 голосов
/ 21 января 2012

У меня возникли проблемы с методом reloadData в UITableView.Я обнаружил, что он вызывает cellForRowAtIndexPath только в случае добавления или удаления новых ячеек.

Пример: у меня пять ячеек, каждая из которых содержит пять строк.Если я добавлю новую ячейку и вызову reloadData, таблица обновится, и я ее увижу.Тем не менее, если я войду в одну из пяти ячеек, добавлю новую строку, затем вернусь и вызову reloadData, ни один из методов делегата табличного представления не будет вызван.

Мой вопрос: возможно ли форсировать таблицу?чтобы полностью перезагрузить данные во всех видимых ячейках?

Ответы [ 6 ]

9 голосов
/ 25 января 2012

Я обнаружил проблему - у меня был код настройки ячейки в блоке if(cell == nil), поэтому, поскольку ячейки перерабатывались, они не менялись.Удаление моего кода настройки из этого блока устранило проблему.

1 голос
/ 01 июля 2017

Вы можете попробовать это

[tableView reloadData];

или

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];

Поместите это в commitEditingStyle метод.

1 голос
/ 20 августа 2013

Я обнаружил, что перезагрузка разделов перезагружает данные с большей готовностью. Если у вас есть только один раздел, вы можете попробовать:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

0 голосов
/ 18 декабря 2012

Не извлекайте код из блока if (cell == nil).Вместо этого создайте репрезентативный идентификатор для создаваемой ячейки;попытаться убедиться, что все содержимое ячейки указано в идентификаторе.Например, если у вас отображается 3 числа, убедитесь, что эти три числа в идентификаторе уникальным образом относятся только к ячейке с таким содержимым.ваш класс, array1, array2 и array3 со значениями int, заключенными в объекты NSNumber.Вы хотите использовать эти NSArrays для заполнения UITableView, вот что я бы сделал:

- (UITableViewCell *)tableView:(UITableView *)tableView 
                     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@",
                            [[array1 objectAtIndex:indexPath.row] intValue],
                            [[array2 objectAtIndex:indexPath.row] intValue],
                            [[array3 objectAtIndex:indexPath.row] intValue]];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                                  initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:identifier] autorelease];

        //Build your cell here.
    }

    return cell;
}
0 голосов
/ 21 января 2012

Даже если ваше табличное представление имеет 50 строк, будет существовать столько ячеек, сколько можно увидеть за один раз.Вот и вся история использования reuseIdentifier.Так что принуждения «все клетки» не существует.Если появляется новая ячейка, данные загружаются динамически.

Единственный способ изменить ячейку - это изменить данные, доставляемые методом dataSource cellForRowAtIndexPath.

0 голосов
/ 21 января 2012

Что ж, табличное представление будет вызывать cellForRowAtIndexPath только для видимых ячеек, но если вы сделаете вызов reloadData, оно сделает это, так что здесь что-то происходит, и я не уверен, что это такое.

...