2012-01-21 3 views
5

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

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

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

ответ

8

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

+0

Ты спас свои часы. Спасибо! Я бы не догадался об этой глупой ошибке :) – Pruthvid

+0

Рад, что мое решение могло помочь кому-то другому! –

0

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

+0

В этом случае все ячейки видны. Я знаю, что источник данных (в этом примере, NSUserDefaults) обновляется, поэтому я не совсем уверен, почему обновляются только новые ячейки. –

+0

Проследили ли вы вызовы 'cellForRowAtIndexPath', чтобы доказать, что они не вызываются или вы просто не видите визуальное изменение? Если 'cellForRowAtIndexPath' не вызывается ... Я не знаю, что происходит. В этот момент я сделал бы один шаг назад и проследил бы вызовы на 'numberOfRowsInSection'. В любом случае, я могу сказать, что 'cellForRowAtIndexPath' _should_ вызывается для каждой видимой ячейки, когда вы выполняете' reloadData'. – smparkes

+0

NSLogs говорят, что когда я добавляю новую строку, все обновляется; моя первоначальная гипотеза была неправильной. При вызове reloadData после возврата в представление таблицы с другого контроллера представления ничего не вызывается. –

0

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

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

+1

Я оговорился в своем вопросе; Я обновил его. –

+0

И если вы попробуете 'reloadRowsAtIndexPaths: withRowAnimation:' Просто чтобы проверить ... Не позволять этому быть решением. – Jodocus

+0

Это также не работает; это не имеет никакого эффекта. –

0

Не снимайте код с блока if (cell == nil). Вместо этого создайте репрезентативный идентификатор для ячейки, которую вы создаете; попробуйте и убедитесь, что все содержимое ячейки указано в идентификаторе. Например, если у вас есть 3 числа, убедитесь, что эти три номера в идентификаторе уникальным образом относятся только к ячейке с таким контентом.

Предположим, у вас есть три свойства NSArray в вашем классе, 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; 
} 
1

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

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

1

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

[tableView reloadData]; 

или

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

положить это в commitEditingStyle метод.

Смежные вопросы