2012-02-16 3 views
1

Что-то странное происходит с моим табличным просмотром при изменении данных. У меня есть что-то вроде этого:Почему моя [tableview reloadData] выполняется слишком поздно?

// fadeout existing data 
... // change data (new values for the cells are blank) 
for{ // loop all rows 
[TableView reloadRowsAtIndexPaths: withRowAnimation:]; // smooth fade out 
} 

// add one new row to the table 
... // change data (just add one new row but leave the cells empty) 
[TableView reloadData] // reload all of the data (new row should be added) 

... // change data (just add values to the existing cells) 
for{ // loop all rows 
[TableView reloadRowsAtIndexPaths: withRowAnimation:]; // smooth fade in 
} 

В теории, по крайней мере, я думаю, это должно сработать. Но у меня были некоторые сбои, поэтому я добавил NSLogs в циклы for и в: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath, поэтому я заметил, что мой [tableView reloadData] выполняется после первого ряда затухания в цикле! @ #

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

  • Есть ли лучший способ добиться того, что я пытаюсь сделать?
  • Могу ли я динамически добавлять одну строку в нижней части таблицы без вызова метода reloadData?

Спасибо.

+1

Вам не нужно выполнять цикл for() над каждой строкой, чтобы перезагрузить его. reloadRowsAtIndexPaths принимает массив указательных путей, поэтому просто создайте этот массив из всех ваших строк и сделайте это с одной перезагрузкой. – jsd

ответ

1

Да, просто используйте метод tableView insertRowsAtIndexPaths, который затем вызовет ваш источник данных для загрузки этих новых строк.

Чтобы загрузить одну строку в конце вашего стола, вы бы сначала обновить источник данных для включения в новую строку, а затем генерировать indexpath с помощью:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[yourdata count]-1 inSection:0]; 
NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; 
[tableView insertRowsAtIndexpaths:indexPaths withRowAnimation:whateveryouwant]; 

Помните, что немедленно позвоните в tableView: cellForRowAtIndexPath, поэтому обновите свой источник данных, чтобы добавить дополнительную строку до, вставив новую строку в вашу таблицу, и будьте осторожны, чтобы индекс строки в указанном указателе indexPath соответствовал недавно добавленному элементу в вашем источнике данных.

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