防止UILabel重复添加到自定义UITableViewCell

时间:2016-04-22 14:22:49

标签: ios objective-c custom-cell

我有一个customCell,我需要在每个单元格中添加多个UILabel作为“标记”, 我的代码是这样的:

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

    static NSString *ID = @"topicCell";
    MSPTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    NSArray *labelArray = [TopicLabelArr objectAt:index.row];
    for (int i = 0; i < [labelArray count]; i++) {
        UILabel *tmpLabel = [UILabel alloc]initwithFrame .....];
        tmpLabel.text = [labelArray objectAt:i];
        [cell.view addSubview:tmpLabel];
    }
    return cell;
}

我使用Xib创建自定义单元格。 我需要的是使for循环仅在每个单元格上执行一次。 但是,tableView中有很多行,当我向上和向下滚动时,每次都会重复创建标签。怎么改进呢?任何的想法?感谢。

2 个答案:

答案 0 :(得分:4)

当您使用dequeueReusableCellWithIdentifier时,您没有创建新的MSPTopicCell您(正如方法名称所示)重用一个单元格。

这是什么意思?你显然需要至少与你同时显示的数量一样多的单元格,但是一旦你开始滚动,滚动视图消失的单元格就会重复使用。

您添加到子视图的标签会超时添加,即使是已经添加了一些子视图的重复使用的单元格也会产生问题。

有很多方法可以解决它,这里有一些例子:

  • 您可以删除添加新视图之前添加的子视图。使用以下代码在for循环之前添加以下行:

    view.subviews.forEach({ $0.removeFromSuperview() }
    
  • 为标签使用自定义标签,以便您可以看到它们已经存在或不存在:

    for (int i = 0; i < [labelArray count]; i++) {
        UILabel *tmpLabel = (UILabel *)[self viewWithTag:100+i];
        if (tmpLabel == nil) 
        {
            tmpLabel = [UILabel alloc]initwithFrame .....];
            tmpLabel.tag = 100 + i;
            [cell.view addSubview:tmpLabel];
        }
        tmpLabel.text = [labelArray objectAt:i];
    }
    
  • 我认为最好的解决方案,因为您已经使用了UITableViewCell子类:只需在UILabel类上直接添加一些MSPTopicCell属性,这样就不会必须在cellForRowAtIndexPath中创建它。但也许这种情况不适合你,因为标签的数量取决于labelArray,它取决于细胞的位置。

答案 1 :(得分:0)

您可以创建一个UIView,其中包含您的所有UILabel。但是,当您重新使用时,只需从superview中删除该视图。 因此,您的单元格中的masterview将被删除

[[cell.contentView viewWithTag:101] removeFromSuperview]
UIView *yourViewName = [[UIView alloc]init];
// set your view's frame based on cell.
yourViewName.tag = 101;
for (int i = 0; i < [labelArray count]; i++) {
    UILabel tmpLabel = (UILabel )[self viewWithTag:100+i];
    if (tmpLabel == nil) 
    {
        tmpLabel = [UILabel alloc]initwithFrame .....];
        tmpLabel.tag = 100 + i;
        [yourViewName addSubview:tmpLabel];
    }
    tmpLabel.text = [labelArray objectAt:i];
}
[cell.contentView addSubView:yourViewName];

此过程也会加快单元格的滚动性能。

希望这个答案对你有所帮助。