iOS UITableView 单元格被重复

Posted

技术标签:

【中文标题】iOS UITableView 单元格被重复【英文标题】:iOS UITableView cells getting duplicated 【发布时间】:2018-09-19 20:52:42 【问题描述】:

我有一个在单元格中创建动态控件的 tableviewcontroller。如果是下拉类型,我会将用户带到不同的 tableviewcontroller 来选择值。选择后,我会弹回并重新加载数据,但是当我这样做时,它会覆盖彼此重叠的单元格。我知道这是因为我在重复使用细胞,但我似乎不知道如何防止它。

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:YES];

    [self.tableView reloadData];




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 


    EWHInboundCustomAttribute *ca = [visibleCustomAttributes objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        cell.tag=indexPath.row;


    if (ca.CustomControlType == 1) 
        cell.detailTextLabel.hidden=true;
        cell.textLabel.hidden=true;

        UITextField *caTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 185, 30)];

            caTextField.adjustsFontSizeToFitWidth = YES;
            caTextField.textColor = [UIColor blackColor];

            caTextField.placeholder = ca.LabelCaption;
            if (ca.ReadOnly) 
                [caTextField setEnabled: NO];
             else 
                [caTextField setEnabled: YES];
            
            caTextField.text=nil;
            caTextField.text=ca.Value;
            caTextField.tag=indexPath.row;

            caTextField.delegate=self;

            [cell.contentView addSubview:caTextField];



     else if (ca.CustomControlType == 4) 

        cell.detailTextLabel.text=ca.Value;
        cell.textLabel.text=ca.LabelCaption;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

     else 

            cell.detailTextLabel.hidden=true;
            cell.textLabel.hidden=true;
            UITextField *caTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 185, 30)];
            caTextField.adjustsFontSizeToFitWidth = YES;
            caTextField.textColor = [UIColor grayColor];

            caTextField.placeholder = ca.LabelCaption;
            [caTextField setEnabled: NO];
            caTextField.text = ca.Value;

            caTextField.tag=indexPath.row;
            caTextField.delegate=self;
            [cell.contentView addSubview:caTextField];
    



    return cell;

【问题讨论】:

为了提高性能,单元被重复使用。这就是为什么您的单元格包含之前显示的内容。我建议在谷歌上搜索“uitableviewcell 重用”之类的内容,并了解它的工作原理。 @EmilioPelaez 是的,我同意重用单元格。但是,我似乎无法弄清楚如何更新 uitextfield 而不是再次创建它。 你不能这样做:[cell.contentView addSubview:caTextField];和 [cell.contentView addSubview:caTextField];使用 IB 为您添加它们。您可以为单元格指定不同的标识符:@"cell"、@"cell1"、@"cell2" 等,直接从 IB 加载单元格,但自己添加子视图。 @E.Coms 你能扩展一下吗?我不明白您添加不同的标识符是什么意思。 您应该永远操纵任何单元格的视图层次结构。而是设计不同的单元格,在不同的标识符下注册。 【参考方案1】:

我建议至少使用[UIView viewWithTag:tag] 来捕获相同的 UITextField 对象,而不是每次都创建 UITextfield。

【讨论】:

【参考方案2】:

我建议您创建自定义 UITableViewCell 子类并将所有与子视图相关的逻辑放在那里。 接下来,为了在重用之前重置/清除单元格 - 您应该覆盖 prepeareForReuse 函数。

斯威夫特:

override func prepareForReuse() 
    super.prepareForReuse()

    //set cell to initial state here

【讨论】:

【参考方案3】:

首先,我建议您使用自定义单元格。如果没有并且您的单元格不是很多,也许您可​​以尝试唯一的单元格标识符以避免单元格重复使用:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    // unique reuseID
    NSString *cellReuseID = [NSString stringWithFormat:@"%ld_%ld", indexPath.section, indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellReuseID];
    if (!cell) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellReuseID];
        // do something
    
    return cell;

希望对你有帮助。

【讨论】:

以上是关于iOS UITableView 单元格被重复的主要内容,如果未能解决你的问题,请参考以下文章

iPhone sdk UITableView 单元重用标识符

在 UITableView 中更改 AVPlayer 的 playerItem

如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?

停止重复使用自定义单元格 Swift

在 UITableView 内的 UIImageView 中从 Web 加载图像

iOS Swift:在自定义 UITableView 单元格中更新二维数组时获取重复值