【问题标题】:UIScrollView in UITableViewCell keeps reloading as table is scrolledUITableViewCell 中的 UIScrollView 在表格滚动时不断重新加载
【发布时间】:2015-02-22 01:03:44
【问题描述】:

我一直在推迟多年的一个非常重要的宠物项目的开发即将结束,而且我遇到了一个更更重大的问题遇到一些额外的功能。

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

Here 你可以看到带有 UIScrollViews 的 UITableViewCell,here 你可以看到在表格中滚动一次后会发生什么。不言而喻,但更多的滚动会导致效果恶化,最终内存使用变得不可持续,而用户体验......好吧,我称之为体验。

有问题的代码如下,它在 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);

我怀疑这既不是填充滚动视图的时间,也不是填充滚动视图的位置,但我不知道放置它的更合适的位置是什么(也许是自定义单元类方法?)。

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

【问题讨论】:

    标签: ios objective-c iphone uitableview uiscrollview


    【解决方案1】:

    您得到的输出并不令人惊讶,因为您在每个单元格中不断向UIScrollView 添加新的UILabels,而没有先删除旧的。在添加新标签之前清除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);
    

    【讨论】:

    • 非常棒,效果很好。并且在 UILabel if 语句中理解,这是解决问题的最后一次尝试(而且非常三心二意)。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多