UITableView单元格刷新问题重新排列

Posted

技术标签:

【中文标题】UITableView单元格刷新问题重新排列【英文标题】:UITableView cell refresh problem on rearrange 【发布时间】:2009-05-08 14:20:35 【问题描述】:

在这里我们将不胜感激!

我有一个自定义 UITableView 单元格,由一个图像(绿色、橙色或红色)和两个不同字体大小的标签组成。 UITableView 由 NSMutableArray 对象驱动。

UITableView 分为三个部分,第一部分包含所有单元格,红色图像,第二部分橙色,第三部分绿色。

我已经实现了在 UITableView 中重新排列单元格的功能,允许用户将带有红色图像的项目从红色部分拖到橙色部分。这种拖动效果很好,并且基础数据已正确更新。我知道是这种情况,因为如果我选择单元格,我会转到其详细视图并更新数据。

但是,UITableView 直到我进入详细信息(或退出应用程序)并返回后才会更新!如果我将有问题的单元格滚动出视图并再次返回视图,它也会更新,因此数组显然包含正确的数据。我就是无法触发视图刷新!

在更改 moveRowAtIndexPath 中的基础数据的代码之后,我尝试了以下操作:

[self.tableView reloadData];

但是这会导致异常。 Apple Language Reference 实际上说在插入、删除或动画时不能调用 reloadData,这当然是我正在做的。此外,尝试使用

刷新单元格
[self setNeedsDisplay];

不起作用(尽管它也不会崩溃)。

关于如何刷新 UITableView 的任何想法?我找不到 afterMoveHasBeenCompleted: 方法或任何东西,所以如果我在 moveRowAtIndexPath: 方法期间无法调用 reloadData,那么我在哪里调用它?!

【问题讨论】:

【参考方案1】:

知道了!!

我发现解决方案是延迟刷新代码,从而阻止它崩溃。

我把 reloadData 调用放到一个单独的方法中:

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

然后延迟 0.5 秒调用它:

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

它并没有崩溃而是刷新了! 0.5 秒的延迟几乎无法察觉,完全可以接受。

希望这对其他人有帮助!

谢谢

菲尔

【讨论】:

或者这只是一个肮脏的黑客行为?有没有我可以使用的“animationComplete”方法?... 这似乎是最好的方法,根据 gpmoore 在 Apple Developer 线程上的帖子:discussions.apple.com/thread.jspa?messageID=8450874 这令人沮丧,但非常令人放心!谢谢!【参考方案2】:

查看 UITableViewDelegate 的参考。如果你为你的 UITableView 分配了一个委托,你可以使用它的方法来处理你的表格视图已经完成某些事情的通知。您可能会使用其中一种

tableView:didEndEditingRowAtIndexPath:
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
来实现这一点。

【讨论】:

不幸的是,tableView:didEndEditingRowAtIndexPath 似乎只在中止“侧滑”操作后触发。即使我能够跟踪编辑结束的点(即当用户单击“完成”时),直到那个点图像仍然是错误的。您建议我已经使用的另一种方法仅允许拖放到其他部分。在我知道是否需要刷新之前,这已经过去了。

以上是关于UITableView单元格刷新问题重新排列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iphone 中刷新 UITableView?

如何隐藏 UITableView Header 然后让它重新出现?

重新排列表格视图单元格后如何更新核心数据记录

使用 Core Data 重新排列 TableView 单元格的顺序

UITableView 单元格折叠动画看起来很糟糕

UITableView 在 TableView 中间加载单元格。为啥?