不要在cellForRowAtIndexPath中添加现有项

时间:2015-02-11 17:27:14

标签: ios uiscrollview tableview custom-cell

在我的TableViewController中我使用自定义单元格,此单元格有一个scrollView。我的cellForRowAtIndexPath方法如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (!cell) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

        // iOS 7 separator
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
            cell.separatorInset = UIEdgeInsetsZero;
        }

    }

    UIView *subview = [cell viewWithTag:indexPath.row + 1];
    if (!subview) {
       //... Set up the new cell
        [self addScrollViewForCell:cell andCellIndx:indexPath.row];
    }
    else {
       // ... Reuse the cell
    }

    return cell;
}

如果视图已经存在 - 我正在尝试不添加scrollView。如果没有 - 添加。 addScrollViewForCell:方法:

- (void)addScrollViewForCell: (CustomCell *)tCell andCellIndx:(NSInteger)cIndx {

    UIScrollView * myScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(5, 62, 350, 61)];
    myScrollView.accessibilityActivationPoint = CGPointMake(100, 100);

    //Some settings
    // ...

    UILabel *lblH = [[UILabel alloc] init];
    lblH.textAlignment = NSTextAlignmentCenter;
    lblH.text = strWeekIdntfr;
    lblH.textColor = [UIColor blueColor];
    lblH.frame = CGRectMake(offsetScores, 0, cCurrWeekBallsWidth, 15);

    [myScrollView addSubview:lblH];

     myScrollView.tag = cIndx + 1;
     [tCell addSubview:myScrollView];
}

问题是 - 当我将表格滚动到底部或向上滚动时,开始添加scrollView。按标签检查视图我尝试区分可重用和新的单元格,但这不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

原因是因为滚动时会重复使用UITableViewCell的实例。

每次重复使用时,此行UIView *subview = [cell viewWithTag:indexPath.row + 1];都会查询具有不同tag的视图。比如说,你在UITableView中有100个单元格,可能会要求一个单元格标记1,6,11,16,21 ... 96,这显然没有。因此,每次重复使用时都可能会创建一个新视图。将其与池中的每个单元格相乘,您将获得添加到其中的新滚动视图的地狱负载。

要解决此问题:只需使用修复tag号码。

所以这一行。

UIView *subview = [cell viewWithTag:indexPath.row + 1];

成为:

UIView *subview = [cell viewWithTag:1];

myScrollView.tag = cIndx + 1;

成为:

myScrollView.tag = 1;

正如@ AdamPro13指出的那样,更好,更优雅的方法是将滚动视图创建为自定义单元格的一部分。只需将其放在initWithFrame:style:的子类的UITableViewCell中。

答案 1 :(得分:0)

我发现它的最佳方式只是清除scrollView中的所有子视图。例如:

[myCell.scrollView.subviewsmakeObjectsPerformSelector:@selector(removeFromSuperview)];