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单元格刷新问题重新排列的主要内容,如果未能解决你的问题,请参考以下文章
如何隐藏 UITableView Header 然后让它重新出现?