Iphone UITableViewCell重复问题

Iphone UITableViewCell重复问题,iphone,objective-c,uitableview,Iphone,Objective C,Uitableview,我有一个带单元格的UItableview。有些单元格有UILabel,有些单元格有UIButton。每当数组中的第一个字符为“^”时,就会创建UIbuttons。但是,当我向下滚动(出现在uilabel上)时,uibuttons会重复。。然后当我向上滚动时,在UILabel上进行乘法运算。有什么线索吗?如果(单元格==nil)单元格的内容不应设置在内。仅应定义结构(布局)。检查后应设置内容: CellIdentifier = @"TableCell"; cell = [tableView de

我有一个带单元格的UItableview。有些单元格有UILabel,有些单元格有UIButton。每当数组中的第一个字符为“^”时,就会创建UIbuttons。但是,当我向下滚动(出现在uilabel上)时,uibuttons会重复。。然后当我向上滚动时,在UILabel上进行乘法运算。有什么线索吗?

如果(单元格==nil)单元格的内容不应设置在
内。仅应定义结构(布局)。检查后应设置内容:

CellIdentifier = @"TableCell";

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        // setup everything that's the same for every cell
        // (e.g. add controls to the cell)
}

// setup everything that's different in each cell (set text, images, ...)

这里发生的是,单元正在“准备”和缓存,因此不必为每个单元重新创建。如果在
中设置单元格的内容,如果(单元格==nil)
,则将单元格的内容存储在缓存中。

实际上,每次滚动节和加载行时,所有标签和ui组件都会在运行时添加到单元格中,您需要清除添加到单元格中的所有视图,每当您的单元格退出队列且不是零时,请参见以下示例:

    static NSString *CellIdentifier;

    CellIdentifier = [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
/*
 *  THIS IS FOR OS VERSION 2.2 THE OLDER VERSION
 *        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
 */

    } else {
        for (UIView* tempView in cell.contentView.subviews) {
            [tempView removeFromSuperview];
        }
    }

UITableView不会为每个逻辑行保留一个UITableViewCell。它只保留屏幕上显示当前行所需的单元格数量。实际上,这意味着在任何时候都只存在9-11个默认高度单元

表视图通过调用表视图的数据源并为行请求一个新单元格或重用现有单元格来创建任意长表的假象。这种重用称为单元的“出列”。滚动过最初显示的行后,不再创建新的单元格实例,而是反复使用相同的单元格实例

出现问题的原因是,一旦将单元格设置为具有UIButton,就永远不会删除该按钮。一旦单元格中有一个按钮,它将永远显示该按钮,即使它用于显示不应该有按钮的逻辑行。因为相同的单元格被反复使用以显示不同的行,所以快速滚动会导致所有单元格显示按钮

要更正问题,需要在显示标签时删除按钮,并在显示按钮时删除标签


更好的是,您应该定义UITableViewCell的两个子类,每个显示一个子类。当有一行带有按钮时,返回按钮子类单元格;当有一行带有标签时,返回标签子类单元格。这样,您就可以将所有单元配置逻辑移动到单元类中,并且只在datasource方法中设置数据。使用子类封装自定义逻辑会产生更整洁、更易于调试和维护的代码

您使用的是可重复使用的单元格,因此在cellForRowAtIndexPath中:您必须检查-单元格中是否有按钮或标签?如果是这样,删除它们,alloc init一个新的,并将其添加为子视图。要做到这一点,使用标记非常方便。

在我的示例中,我不确定结构和内容之间的区别是什么。“结构”是所有单元格都相同的东西。“内容”是每个单元格中的变化。很抱歉,在我的示例中,我仍然无法理解这一点。我使用了iAnsari的方法,并在tempView removeFromSuperview循环之后输入标签和按钮创建代码,它似乎起到了作用。可能不是最好的方法。我遵循了iAnsari的方法,在从superView中删除后创建了单元格项(按钮或标签)。我认为你的解决办法会更简洁,但我发现很难理解。当我有更多的时间时,我会回到这个问题上来。