iOS 5最终向moveRowAtIndexPath:toIndexPath:
添加了UITableView
方法。问题是,调用它只会移动行,它不会更新/重绘它。这样做的唯一方法似乎是找到单元格并直接调用setNeedsDisplay。但这很棘手,因为你永远都不知道细胞是否已经被移动了。
我也无法致电reloadRowsAtIndexPaths:
,因为我不允许将2个动画应用于同一beginUpdates-endUpdates
块内的单个行。
我可以想到一些可行的解决方法,比如将整个事物分成2个动画块。但是我想知道我是否遗漏了一些东西,因为整个行为对我来说似乎很奇怪。
答案 0 :(得分:14)
最后收到Apple关于此问题的正式回答:
Engineering已确定此问题的行为符合预期 关于以下信息:
仅插入和更新会导致从数据中请求单元格 来源(第一个因为它是新的,第二个是因为你 明确告诉表视图更新单元格)。删除并移动 不要更新内容,因为这不是动作中隐含的内容 被执行。如果需要更改单元格的内容 在更新期间,只需进入单元格并更改内容。
答案 1 :(得分:2)
他们喜欢让我们很难不这样做; - )
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
// old API
//[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
//[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
// new API
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath
[tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0);
break;
注意在ChangeMove中,configureCell与在ChangeUpdate中的使用相比具有不同的参数,因此在复制粘贴时要小心。为了做到这一点非常棘手。