2016-07-15 58 views
1

我有一个基于UITableView的游戏商店。在不影响动画的情况下重新载入表格视图中的数据

每个单元都有一个“购买”按钮其中大部分是启用,并且可以切换到“买”如果该项目是一次性购买,也可以禁用,如果没有足够的钱。

现在我要做的就是打电话reloadData每次购买按钮被按下,以更新可见单元格和当前细胞本身。 (我必须更新所有单元格,因为购买后可能不会有足够的钱用于可见项目单元格)。

但它导致奇怪的动画故障,就像当我点击一个单元的购买按钮和动画完成另一个。

我认为这是由于细胞的可重用性。所以我想知道的是如何在整个表格视图中重新加载数据而不影响本机动画。

我能想到的唯一的事情是不使用可重复使用的细胞和缓存他们,但我不认为这是一个良好的编程习惯。

回答

2

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

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

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

当你的电池可重复使用,你会传递一个新的item它。它应该停止观察前一个,并开始观察新的(并且当然重新配置它以匹配当前状态)。

通过从模型(这是稳定的和长期的)分离视图(可重复使用和暂时的),您可以获得具有正确动画的细胞重用的性能优势,无需致电reloadData

+0

嗯,我认为这是一个不好的设计,当细胞知道它的模式... – s1ddok

+0

而且我没有看到它如何帮助我更新的其他细胞,以查看是否有他们 – s1ddok

+0

小区金钱知道如何显示特定模型类是优秀的设计,并一直回到SmallTalk。只要它只是观察模型并不断提供它的视觉表示。单元格只是一个视图。如果他们需要知道总金额,可以给他们一个“账户”对象。 –

0

您可以在单元类中有一个reloadCell方法,并通过表visibleCells循环并以这种方式更新它们的UI。这样他们不会被重新创建(或重新使用),他们只是有相关的UI片断,由于新的数据更新可能已经改变。

+0

这可以工作,但我需要告诉细胞有关它的模型,而这正是我试图避免 – s1ddok

+0

您设置了细胞最初一些如何,只要使用同样的方法做一遍。 – Putz1103

相关问题