UITableViewCell 中的 UIScrollView 在 table 滚动时不断重新加载

UIScrollView in UITableViewCell keeps reloading as table is scrolled

我已经推迟了多年的一个非常重要的宠物项目的开发接近尾声,而且我什至 更多我 运行 通过添加一些功能解决的问题。

在这个应用程序中,我有一个 UITableView,它有一个带有 UIScrollView 的自定义单元格。在这个滚动视图中,我用数组的内容动态填充它。虽然我的这个工作很完美(差不多),但它带来了意想不到的副作用:每当 table 滚动时,UIScrollViews 不会像我期望的那样刷新,而是生成更多UILabels 本身。

Here you can see the UITableViewCell with the UIScrollViews, and here 只需滚动 table,您就可以看到发生了什么。不言而喻,但更多的滚动会导致更糟糕的效果,最终内存使用变得不可持续并且用户体验是......好吧,这不是我所说的 体验.

有问题的代码在下面,它在 tableView:cellForRowAtIndexPath: 方法中。

int stopCount = (int)[[busStop valueForKey:@"Stop Times"] count];
int horizontalSpacing = 0;
for (int i = 0; i < stopCount; i++) {
    UILabel *timeLabel;
    if (!timeLabel) {
        timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(horizontalSpacing, 0, 75, 20)];
        timeLabel.text = [[busStop valueForKey:@"Stop Times"] objectAtIndex:i];
        timeLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:17.0];
        horizontalSpacing += timeLabel.bounds.size.width;
        [cell.stopTimesView addSubview:timeLabel];
    }
}
cell.stopTimesView.contentSize = CGSizeMake(horizontalSpacing, 20);

我怀疑现在不是填充滚动视图的时间和地点,但我不知道放在哪里更合适(也许是自定义单元格 class 方法?)。

我非常感谢任何人可以就此事提供的所有帮助。

你得到的输出并不令人惊讶,因为你在每个单元格中不断向 UIScrollView 添加新的 UILabel,而没有先删除旧的。在添加新标签之前清除 UIScrollView 的内容,方法是像这样

[cell.stopTimesView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]

另外,我看不出下面代码的意义所在:

UILabel *timeLabel;
if (!timeLabel)

由于您在上面的行中定义了 timeLabel,它显然将具有 nil 的值,因此 if 语句是不必要的。

所以你的最终代码应该是这样的:

int stopCount = (int)[[busStop valueForKey:@"Stop Times"] count];
int horizontalSpacing = 0;

[cell.stopTimesView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

for (int i = 0; i < stopCount; i++) {
    UILabel *timeLabel = timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(horizontalSpacing, 0, 75, 20)];
    timeLabel.text = [[busStop valueForKey:@"Stop Times"] objectAtIndex:i];
    timeLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:17.0];
    horizontalSpacing += timeLabel.bounds.size.width;
    [cell.stopTimesView addSubview:timeLabel];
}
cell.stopTimesView.contentSize = CGSizeMake(horizontalSpacing, 20);