Ничего из перечисленного не будет работать.
В исходном опубликованном коде табличное представление будет аварийно завершено, поскольку оно удаляет данные, которые все еще будут использоваться, и даже после того, как это будет исправлено, массив не будет иметь правильных данных из-за способа, которым таблица «переставляет». *
exchangeObjectAtIndex: withObjectAtIndex: не будет работать для перестановки массива в соответствии с тем, как табличное представление реализует свою собственную перестановку
Почему?
Потому что, когда пользователь выбирает ячейку таблицы, чтобы переставить ее, эта ячейка НЕ заменяется на ячейку, в которую он перемещается. Выбранная ими ячейка вставляется с новым индексом строки, а затем исходная ячейка удаляется. По крайней мере, так кажется пользователю.
Решение:
Из-за того, что tableview реализует перестановку, нам нужно выполнить проверку, чтобы убедиться, что мы добавили и удалили правую строку.
Этот код, который я собрал, прост и отлично работает для меня.
Используя исходные данные размещенного кода в качестве примера:
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
toIndexPath:(NSIndexPath *)toIndexPath
{
NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row);
// fetch the object at the row being moved
NSString *r = [rows objectAtIndex:fromIndexPath.row];
// checks to make sure we add and remove the right rows
if (fromIndexPath.row > toIndexPath.row) {
// insert the object at the target row
[rows insertObject:r atIndex:toIndexPath.row];
// remove the original from the data structure
[rows removeObjectAtIndex:(fromIndexPath.row + 1)];
}
else if (fromIndexPath.row < toIndexPath.row) {
// insert the object at the target row
[rows insertObject:r atIndex:(toIndexPath.row + 1)];
// remove the original from the data structure
[rows removeObjectAtIndex:(fromIndexPath.row)];
}
}
Если вы потратите несколько минут и посмотрите, что происходит с просмотром таблицы во время перегруппировки, вы поймете, почему мы добавили единицы к тому, что мы сделали.
Я довольно новичок в xcode, так что я знаю, что, возможно, есть более простой способ сделать это, или код может быть упрощен .... Просто пытаюсь помочь, где могу, потому что это заняло у меня несколько часов чтобы понять это. Надеюсь, это сэкономит кому-то время!