János János - 1 month ago 8
iOS Question

How to reload tableview after reordering a row? Rows have variable height

I let user to reorder rows in

tableView
. Because this event affects content - some numeric values in cells should be updated - in all the other rows, I call a
reloadData
in
moveRowAtIndexPath
. And then strange effects occur.

I.e. cells seems overlapping when touching dragger, and some cell starts to move up and down. Its important to know, that cells height are varying.

The strange, that if I remove
reloadData
from
moveRowAtIndexPath
, then all these phenomenons disappear. Only the content is invalid.

So how should I reload data after reordering?




UPDATE: What I have done meantime reconfiguring cells in
viewDidLayoutSubviews
instead of call
reloadData
end of the
moveRowAtIndexPath
. And it works 90% like I expect, but still rows are sometimes somewhat higher they should.

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

//..

reorderOccured = true
}

override func viewDidLayoutSubviews() {

if reorderOccured {

for cell in tableView.visibleCells() as! [UITableViewCell] {

let ip = tableView.indexPathForCell(cell)
if ip != nil {
self.configureCell(cell, indexPath: ip!)
}
}

reorderOccured = false
}
}

Answer

I found here the answer: http://stackoverflow.com/a/4692563/239219

[tableView beginUpdates];
[tableView endUpdates];

This code forces UITableView to reload cell sizes only, but not cell contents.