代码之家  ›  专栏  ›  技术社区  ›  Brij

在iphone中滚动时tableview单元格的重复问题

  •  2
  • Brij  · 技术社区  · 15 年前

    有5个单元格,每个单元格有一个动态标签。使用HeightForRowatingIndexPath方法根据标签内容定义单元格高度。现在,显示3个单元格。当我滚动到下一个单元格时,将调用一次cellforrowatindexpath,并在输出中正确显示任何一个(4或5)单元格,但另一个单元格具有第一个单元格内容(重复)。 有什么解决办法吗?应调用CellForRowatindexpath方法2次。 我正确地定义了节和行。

    7 回复  |  直到 15 年前
        1
  •  3
  •   new soul    14 年前

    撤销判决

    如果(单元格==零)

    很好。我现在解决我的问题了。非常感谢。

        2
  •  1
  •   Adam Woś    15 年前

    您可能没有正确地重用单元。当您滚动时,前一个单元格将被 UITableView ,但您没有正确更改其内容。

    代码在 cellForRowAtIndexPath 应该与此类似:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *kCustomCellID = @"CustomCellID";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCellID];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kCustomCellID] autorelease];
        }
    
        cell.textLabel.text = [self.dataArray objectAtIndex:indexPath.row];
        cell.detailTextLabel.text = [self.dateFormatter stringFromDate:[NSDate date]];
    
        return cell;
    }
    

    你看起来像这样吗?

        3
  •  0
  •   vfn    15 年前

    由于每一行没有固定的大小,所以不能重用它们,除非再次显示相同的内容或某些类似的内容。

    我的建议是为每一行创建一个不同大小的标识符。

    您说过有一个开关可以添加基于indexpath的内容,因此应该根据每个case语句的大小,将可重用的单元格出列。

        4
  •  0
  •   Preetham    11 年前

    永不移除 if(cell == nil) .

    相反,请清除已添加到单元格中的子视图。

      if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:CellIdentifier] ;
           }else{
           NSArray *cellSubviews= [cell.contentView cellSubviews];
            for (UIView * view in subviews) {
                [view removeFromSuperview];
            }
        }
    
        5
  •  0
  •   Bhavesh Nayi    11 年前
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *CellIdentifier = [NSString stringWithFormat:@"cell %d",indexPath.row];
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    
            cell.textLabel.text = @"Hello";
    
        }
        // Configure the cell.
        return cell;
    }
    
        6
  •  0
  •   Chandan kumar    9 年前

    试着给每个单元格一个唯一的标识符,

    nsstring*cellidentifier=[nsstring stringwithformat:“单元格%d”,indexpath.row];

    不知道这是不是正确的方法,但它应该能解决你的问题。

        7
  •  -6
  •   Brij    15 年前

    问题是单元格不是nill,所以在滚动时多次返回同一单元格。我从cellforrowatindexpath方法中去掉了这个条件。

    if (cell == nil)
    

    现在每次,它都在分配单元格并且工作正常。