滚动时更新 UITableViewCell

Posted

技术标签:

【中文标题】滚动时更新 UITableViewCell【英文标题】:Update UITableViewCell while scrolling 【发布时间】:2015-01-06 20:15:44 【问题描述】:

我正在尝试将图像从服务器异步加载到单元格。但是滚动时图像不会改变,只有在滚动停止后才会改变。只有在滚动停止后,“加载”消息才会出现在控制台中。我希望图像在滚动时出现在单元格中。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    CustomCell *cell = (CustomCell *)[_tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    ZTVRequest *request = [[ZTVRequest alloc] init];
    [request getSmallImg completionHandler:^(UIImage *img, NSError *error) 
        if (! error) 
            NSLog(@"loaded")
            cell.coverImgView.image = img;
        
    ];

    return cell;

【问题讨论】:

您的cell.coverImgView.image = omg; 似乎正在后台线程上运行,因此不会立即更新。您必须使用类似的方式将图像加载分配到主队列:dispatch_async(dispatch_get_main_queue(), ^ cell.coverImgView.image = img; )。见:***.com/q/4944363/558933 没有帮助。我已经添加了答案。 【参考方案1】:

我正在使用 NSURLConnection 加载图像。我在这个答案中找到了解决方案:https://***.com/a/1995318/1561346 by Daniel Dickison

这里是:

在您停止滚动之前不会触发连接委托消息的原因是因为在滚动期间,运行循环位于 UITrackingRunLoopMode 中。默认情况下,NSURLConnection 仅在NSDefaultRunLoopMode 中进行调度,因此您在滚动时不会收到任何消息。

以下是在“普通”模式下安排连接的方法,其中包括UITrackingRunLoopMode

NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
                               initWithRequest:request
                               delegate:self
                               startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
            forMode:NSRunLoopCommonModes];
[connection start];

请注意,您必须在初始化程序中指定 startImmediately:NO,这似乎与 Apple 的文档背道而驰,该文档建议您即使在启动后也可以更改运行循环模式。

【讨论】:

以上是关于滚动时更新 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

向下滚动时 Android 更新 ListView

表更新时 NSFetchedResultsController 无法滚动

IOS - 如何在滚动元素时更新元素的界面?

滚动时在 UIScrollView 内更新 UITextView 会使 scrollView 停止滚动

滚动时更新自定义列表视图失败

使用 CollapsingToolbar 滚动时如何更新工具栏