Проблема с обновлением ячейки UITableView при перестановке

StackOverflow https://stackoverflow.com/questions/840011

Вопрос

Здесь мы были бы очень признательны за некоторую помощь!

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

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

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

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

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

[self.tableView reloadData];

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

[self setNeedsDisplay];

не работает (хотя и не выходит из строя).

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

Это было полезно?

Решение

Понял!!

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

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

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

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

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

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

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

Спасибо

Фил

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top