我接近一个非常重要的宠物项目的开发即将结束,我已经推迟了多年,我甚至还有更多我遇到了一些实质性的问题。
在这个应用程序中,我有一个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);
我怀疑这既不是填充滚动视图的时间也不是填充滚动视图的地方,但我仍然坚持在哪里放置一个更合适的位置(也许是自定义单元类)方法?)。
我非常感谢任何人可以就此事提供的任何和所有帮助。
答案 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}}