我有一个自定义的UITableViewCell,在我开始滚动之前,似乎在我的桌子上多次出现。似乎dequeueReusableCellWithIdentifier无法正常工作。这是我的手机:
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
... setup ...
}
当我在tableView上调用reloadRowsAtIndexPaths:由于某种原因,它不会使该单元格出列并重新创建新单元格。然后,当我向上滚动然后再向下滚动时,有时我的第一个单元格会出列,有时第二个单元格会出列。 MyCustomCell基本上是一个文本字段,因此根据哪一个出列,文本每次都有不同的数据。
我的自定义单元格中还有其他更多内容吗?提前谢谢。
答案 0 :(得分:1)
您在提问时提到reloadRowsAtIndexPaths:
,但该方法实际上是reloadRowsAtIndexPaths:withRowAnimation:
。重新加载可以动画的事实很重要。例如,要为UITableViewRowAnimationLeft
设置动画,表格视图需要在新单元格中滑动时滑出旧单元格。旧单元格和新单元格同时在屏幕上,因此表格视图不能仅使用相同的UITableViewCell
对象。这就是为什么“它不会使该单元出列并重新创建新单元”。它需要一个新的,因为旧的仍然是可见的。
您需要确保在收到tableView:cellForRowAtIndexPath:
消息时,完全初始化单元格(无论是已出列还是新创建)以显示所请求行的数据,并且仅 请求行的数据。
此外,您无法将自己的映射从行的indexPath
保留到单元格,因为(在动画期间)可能有两个单元格用于同一行。相反,如果您在任何时候需要获取当前显示行数据的单元格,则需要通过向其发送cellForRowAtIndexPath:
消息来询问表格视图。
答案 1 :(得分:0)
从您显示的代码中,看起来好像只在创建新单元时设置单元格的内容。由于无法知道您将从缓存中提供哪个单元格,因此您需要配置单元格是新单元格还是重新使用单元格。