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);
我已经推迟了多年的一个非常重要的宠物项目的开发接近尾声,而且我什至 更多我 运行 通过添加一些功能解决的问题。
在这个应用程序中,我有一个 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);