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

时间:2015-02-22 01:03:45

标签: ios objective-c iphone uitableview uiscrollview

我接近一个非常重要的宠物项目的开发即将结束,我已经推迟了多年,我甚至还有更多我遇到了一些实质性的问题。

在这个应用程序中,我有一个UITableView,它有一个带有UIScrollView的自定义单元格。在这个滚动视图中,我使用数组的内容动态填充它。尽管我的工作非常完美(ish),但它带来了意想不到的副作用:每当滚动表格时,UIScrollViews都不会像我期望的那样刷新,并在其中生成更多的UILabel自己。

Here你可以看到带有UIScrollViews的UITableViewCell,here你可以看到只需滚动一下表后会发生什么。毋庸置疑,但更多滚动导致效果恶化,最终内存使用变得不可持续,用户体验就是......好吧,它不是我所谓的体验< / em>的

违规代码如下所示,它位于 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);

我怀疑这既不是填充滚动视图的时间也不是填充滚动视图的地方,但我仍然坚持在哪里放置一个更合适的位置(也许是自定义单元类)方法?)。

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

1 个答案:

答案 0 :(得分:2)

您获得的输出并不令人惊讶,因为您不断向每个单元格中的UILabel添加新的UIScrollView,而不会先删除旧的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); 语句是不必要的。

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

{{1}}