2012-06-16 76 views
0

我有一个自定义的UITableViewCell,它似乎在我开始滚动之前在我的表格上多次出现。看来dequeueReusableCellWithIdentifier工作不正常。这里是我的手机:多余的UITableView单元格

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

当我打电话reloadRowsAtIndexPaths:在我的tableView,由于某种原因,它并没有出列细胞,并将其重新创建新的。然后,当我再次滚动,然后再次滚动时,有时我的第一个单元出队,有时第二个单元退出。 MyCustomCell基本上是一个文本字段,因此取决于哪一个出队,文本每次都有不同的数据。

在我的自定义单元格中还有更多我应该做的事情吗?提前致谢。

+0

我们可以看到您用来创建'CellIdentifier'变量的代码吗? –

+0

static NSString * CellIdentifier = @“ccCell”; – VTS12

+0

你的代码似乎没问题。您的UITableView大小正确吗?也许你正在使用一个设置,使视图认为你有一个非常高的表。你没有把UITableView放在UIScrollView里面,对吗?你使用的是什么版本的iOS SDK?你不需要为你的自定义类做任何事情。 –

回答

0

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

+0

正确。您在出列返回nil时创建新的单元格,但您必须将其配置为显示指定的行/动作,而不管是否重用或创建。 –

1

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

你需要确保当您收到tableView:cellForRowAtIndexPath:消息,你完全初始化细胞(是否出队或新建)以显示数据请求的行,并只请求行的数据。因为(在动画过程中)同一行可能有两个单元格,所以您无法将自己的映射从行的indexPath保留到单元格。相反,如果您在任何时候需要获取当前正在显示某行数据的单元格,则需要通过向其发送cellForRowAtIndexPath:消息来询问该单元格的表格视图。

+0

@ rob mayoff我使用与动画UITableViewRowAnimationNone相同的方法,即使它是第一次创建一个新的单元格。为什么不能像重装方法那样使用相同的可重用单元呢? –