Проблема обновления ячейки UITableView при перестановке - PullRequest
5 голосов
/ 08 мая 2009

Некоторая помощь будет принята здесь с благодарностью!

У меня есть пользовательская ячейка UITableView, состоящая из изображения (зеленого, оранжевого или красного) и двух меток с разными размерами шрифта. UITableView управляется NSMutableArray объектов.

UITableView разделен на три раздела: первый раздел содержит все ячейки с красным изображением, второй раздел с оранжевым, третий раздел с зеленым.

Я реализовал возможность переставлять ячейки в UITableView, позволяя пользователю перетаскивать, скажем, элемент с красным изображением из красной секции в оранжевую секцию. Это перетаскивание прекрасно работает, и основные данные обновляются правильно. Я знаю, что это так, потому что, если я выберу ячейку, я перейду к ее подробному виду и данные обновятся.

Тем не менее, UITableView не обновляется, пока я не укажу детали (или не выйду из приложения) и не вернусь! Он также обновляется, если я прокручиваю поврежденную ячейку вне поля зрения и снова в поле зрения, поэтому массив четко содержит правильные данные. Я просто не могу вызвать обновление представления!

После кода я попробовал следующее для изменения базовых данных в moveRowAtIndexPath:

[self.tableView reloadData];

Однако это вызывает исключение. В Apple Language Reference фактически говорится, что reloadData нельзя вызывать при вставке, удалении или анимации, что, конечно, я и делаю. Кроме того, пытаясь просто обновить ячейку с

[self setNeedsDisplay];

не работает (хотя и не падает).

Любые идеи о том, как я могу обновить UITableView? Я не могу найти afterMoveHasBeenCompleted: метод или что-то еще, поэтому, если я не могу вызвать reloadData во время моего moveRowAtIndexPath: метод, тогда где я могу его вызвать?!

Ответы [ 2 ]

4 голосов
/ 11 мая 2009

Понял !!

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

Я поместил вызов reloadData в отдельный метод:

- (void)refreshDisplay:(UITableView *)tableView {
[tableView reloadData]; }

, а затем вызывается с задержкой 0,5 секунды:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

И он не вылетел, а обновился! Задержка 0,5 с едва заметна и полностью приемлема.

Надеюсь, это поможет кому-то еще!

Спасибо

Phil

2 голосов
/ 10 мая 2009

Посмотрите на ссылку для UITableViewDelegate. Если вы назначаете свой UITableView делегату, вы можете использовать его методы для обработки уведомлений о том, что ваше табличное представление что-то сделало. Вы, вероятно, будете использовать один из

tableView:didEndEditingRowAtIndexPath:
или
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
чтобы сделать это.
...