一张图片值一千字,我猜下面的图片清楚地表达了我现在面临的问题。
以下是一个小小的总结:
我创建了一个tableView,每个tableViewCell都有一个textField作为子视图。我上下滚动,我的观点被搞砸了。我猜是因为Cell Reusability。但我需要帮助。
Note:这个问题是,而不是因为按钮的或屏幕底部的uitextView。如果我没有它们,而且我只有前三个部分,那么textFields就会被移动,它会扰乱几个单元格的textFields。还请注意与其他图像相比,图像4中的textField移动。代码粘贴在这里,http://www.pastie.org/2203340
**P.S.:** I have added the solution to the problem at the end of the question. 这是我的正常视图

--这是我向下滚动(看下面)的时候

在几次上下滚动后.(见下文)

几个卷轴后的.(见下文)

解决方案:
我真的很感谢@caleb和其他人为我指明了正确的方向,帮助我修复了这个bug。对于那些同样面临同样问题的人,我认为我应该给出一个简短而甜蜜的答案。
将UITableViewCells与不同的CellIdentifiers.一起使用,以确保不会调用相同的单元格。
发布于 2011-07-12 19:30:26
您的猜测与单元重用有关是正确的。我注意到的第一件事是,您对所有的单元使用相同的单元标识符。这意味着所有单元格都被认为是相同的,并且您应该假设每一次都必须配置有关单元格的所有内容。对不同类型的细胞使用不同的识别符会更容易,但我会让你仔细考虑一下.
无论如何,问题的根源在于以下代码:
if (section ==3){
cell =nil;
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (indexPath.row ==0){
cell.backgroundColor = [UIColor clearColor];
cell.contentMode = UIViewContentModeScaleToFill;
[cell.contentView addSubview:self.footerView];
}
}对于这个特定的单元格,您将背景颜色设置为清除、添加footerView等。但是您没有为任何其他单元格设置背景色,因此一旦这个特定的单元格在不同的位置被重用,您将得到该位置的清晰背景和其他修改。
现在,您可能更容易理解为什么要为不同类型的单元使用不同的单元格标识符。如果您对清除单元格使用与对白色单元格不同的标识符,则不必担心清除单元格被回收为白色单元格,反之亦然。您应该对每个“单元类型”使用不同的标识符,其中“单元类型”由您每次重用单元格时不想配置的所有单元格属性定义。
您在-reuseTableViewCellWithIdentifier:withIndexPath:方法中做了大量工作,最终导致单元格不能很好地重用。相反,您应该标识单元格的每个不同的“类型”或“样式”,这些单元格要独立于它们中显示的特定信息显示。例如,前三节中的所有单元似乎都是相同的:它们都类似于UITableViewCellStyleValue1标准单元格样式,只是细节标签左为空,右侧添加了一个文本字段。然后,对所有这些单元使用相同的重用标识符。-reuseTableViewCellWithIdentifier:withIndexPath:真的不应该关心索引路径--它应该按照所提供的重用标识符来创建和返回所需样式的单元格。将设置这些单元格中字段的文本的工作留给-tableView:cellForRowAtIndexPath:方法。
我注意到,在创建每个单元格时,您正在存储索引路径和指向文本字段的指针。如果你在重复使用细胞,这两种方法都不会有帮助。
如果您永远不会向表中添加比所显示的单元更多的单元格,那么简单地跳过整个重用过程可能会更简单。当滚动一个包含数十个或数百个单元格的表时,重用单元格会显着地提高性能,但是如果您永远不会有超过十个或十五个单元格,并且其中一半在任何特定时间都在屏幕上,那么重用单元格的好处就没有那么大了。尽管如此,我还是鼓励您花时间思考这个想法;迟早您会想要创建一个多行的表。
发布于 2011-07-12 19:26:01
我以前也有过这种经历。尝试为每种类型创建一个新单元格。这样,包含文本字段的单元格就不会仅用于标题单元格。
发布于 2011-07-12 19:25:13
解决这一问题的一种方法是将cellForRowAtIndexPath方法中的所有单元格设置为零。这可以确保每一张都是刚画出来的,不可能像你的照片中那样被覆盖。缺点是系统需要额外的工作,不能像它想要的那样重用单元
https://stackoverflow.com/questions/6669806
复制相似问题