在表视图中重新加载数据而不会损害动画

时间:2016-07-15 19:43:39

标签: ios uitableview uikit

我有一个基于UITableView的游戏商店。

每个单元格都有一个“购买”按钮,该按钮大部分已启用,如果该项目是一次性购买,则可以切换为“BOUGHT”,如果没有足够的金额,则可以禁用。

现在我所做的是每次按下购买按钮时调用reloadData以更新可见单元格和当前单元格本身。 (我必须更新所有单元格,因为购买后可能没有足够的钱用于可见的项目单元格。)

但它会导致奇怪的动画故障,比如当我点击一个单元格的购买按钮并且动画完成另一个时。

我认为这是由于细胞的可重用性而发生的。所以我想知道的是如何在不损害原生动画的情况下在整个表视图中重新加载数据。

我唯一能想到的就是不使用可重用的单元格并将它们全部缓存,但我不认为这是一个很好的编程习惯。

2 个答案:

答案 0 :(得分:2)

首先,确保您的视图图层和模型图层是分开的。应该有一些非视图对象知道每个项目;我们称之为Item

现在,创建一个ItemCell(您可能已经拥有一个)。那是你可重复使用的细胞。交给Item。它应该根据那里的数据进行自我配置。

使用KVO,委托或通知让单元格观察其项目。当Item更改其状态时,单元格应更新自己的按钮。

当你的手机被重复使用时,你会向它传递一个新的item。它应该停止观察前一个,并开始观察新的(当然重新配置自己以匹配当前状态)。

通过将视图(可重用和暂时性)与模型(稳定且长寿)分离,您可以获得具有正确动画的单元重用的性能优势,而无需调用reloadData。 / p>

答案 1 :(得分:0)

您可以在单元格类中使用module ApplicationHelper def show_user_bg if user_signed_in? "background:transparent url(offer.image}) no-repeat fixed left top;" else "background:transparent url('/images/default_bg.png') no-repeat fixed left top;" end end end 方法并遍历表reloadCell并以这种方式更新其UI。这样他们就不会被重新创建(或重复使用),他们只是拥有相关的UI部分,这些部分可能因更新的新数据而发生变化。