0

我有一个自定义 UITableViewCell 似乎在我开始滚动之前多次出现在我的桌子上。似乎 dequeueReusableCellWithIdentifier 工作不正常。这是我的手机:

MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    ... setup ...
}

当我在我的 tableView 上调用 reloadRowsAtIndexPaths: 时,由于某种原因,它不会使该单元格出列,而是重新创建新单元格。然后当我向上滚动然后再次向下滚动时,有时我的第一个单元格出列,有时第二个单元格出列。MyCustomCell 基本上是一个文本字段,因此取决于哪个出队,文本每次都有不同的数据。

在我的自定义单元格中我还应该做些什么吗?提前致谢。

4

2 回答 2

1

reloadRowsAtIndexPaths:在问题中提到,但方法实际上是reloadRowsAtIndexPaths:withRowAnimation:. 重新加载可以动画的事实很重要。例如,要制作动画UITableViewRowAnimationLeft,表格视图需要滑出旧单元格,同时滑入新单元格。新旧单元格同时出现在屏幕上,因此表格视图不能只UITableViewCell为两者使用相同的对象。这就是为什么“它不会使那个单元出队而是重新创建新的”。它需要一个新的,因为旧的仍然可见。

您需要确保在收到tableView:cellForRowAtIndexPath:消息时完全初始化单元格(无论是出队的还是新创建的)以显示请求行的数据,并且显示请求行的数据。

此外,您不能保留自己的从行indexPath到单元格的映射,因为(在动画期间)同一行可能有两个单元格。相反,如果在任何时候您需要获取当前显示行数据的单元格,您需要通过向表格视图发送cellForRowAtIndexPath:消息来询问该单元格。

于 2012-06-16T18:17:28.777 回答
0

从您显示的代码看来,您似乎只在创建新单元格时才设置单元格的内容。由于无法知道您将从缓存中获得哪个单元格,因此您需要配置该单元格是新的还是正在重复使用的单元格。

于 2012-06-16T18:12:22.643 回答