Почему мой [tableview reloadData] выполняется слишком поздно? - PullRequest
1 голос
/ 16 февраля 2012

Что-то странное происходит с моим просмотром таблицы при изменении данных. У меня есть что-то вроде этого:

// 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 Ответ

1 голос
/ 16 февраля 2012

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

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

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

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

...