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

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

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

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

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

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

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

[self.tableView reloadData];

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

[self setNeedsDisplay];

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

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


person h4xxr    schedule 08.05.2009    source источник


Ответы (2)


Понятно!!

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

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

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

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

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

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

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

Спасибо

Фил

person h4xxr    schedule 11.05.2009
comment
Или это просто грязный хак? Есть ли метод animationComplete, который я могу использовать вместо этого?... - person h4xxr; 11.05.2009
comment
Кажется, это лучший способ сделать это, согласно сообщению gpmoore в этой ветке разработчиков Apple: discussions.apple.com/thread.jspa?messageID=8450874 - person Tim; 11.05.2009
comment
Это расстраивает, но очень обнадеживает! Спасибо! - person h4xxr; 11.05.2009

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

tableView:didEndEditingRowAtIndexPath:
или
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
для достижения этой цели.

person Tim    schedule 10.05.2009
comment
К сожалению, tableView:didEndEditingRowAtIndexPath, кажется, срабатывает только после отмены действия бокового смахивания. Даже если бы я мог отследить момент окончания редактирования (т. е. когда пользователь щелкнул кнопку «Готово»), до этого момента изображения все равно были бы неправильными. Другой метод, который вы предлагаете, я уже использую, чтобы разрешить перетаскивание только в другие разделы. Это прошло, прежде чем я знаю, нужно ли мне обновлять или нет. - person h4xxr; 11.05.2009