从背景更新过滤表中的单元格?
Posted
技术标签:
【中文标题】从背景更新过滤表中的单元格?【英文标题】:Update a cell in a filtered table from background? 【发布时间】:2012-07-25 21:34:37 【问题描述】:我有一个显示图像的表格。它可以实时搜索,从而调整显示的单元格。当图像尚未立即可用时,图像会在网络上使用并发的NSOperation
子类在后台加载。
获取图像后,我想更新表格以显示它。
如何更新正确的单元格?
我不能依赖我在tableView:cellForRowAtIndexPath:
中构建的单元格,因为该单元格可能已被重新用于另一行。
我不能依赖传递给tableView:cellForRowAtIndexPath:
的indexPath
,因为它可能在更新开始后由于搜索词更改而发生了变化。
我无法搜索表格中的可见单元格,因为这些单元格本身就是 UITableViewCell
的实例并且没有元数据。
我无法搜索过滤后的列表,因为我不知道要将更改应用到哪个表。
我错过了什么?
【问题讨论】:
【参考方案1】:我在应用商店的应用中执行此操作。我在我的视图控制器中创建了一个通知处理程序,当图像到达时会收到通知。该图像具有与之关联的标签 - 我可以将其映射到需要它的视图。
创建单元格后,我将 UIImageView 添加到 contentViews 数组,并带有一个与图像关联的标签匹配的唯一标签(您可以将这些标签偏移 10,000 以避免冲突)。
然后我向 UITableView 询问可见单元格的数组。我遍历它们,向每个单元格的 contentView 询问 viewWithTag:tag (唯一标签)。如果找到,我有正确的 UIImageView,我设置了图像。
显然,在向 tableView 提供单元格时,您必须始终为 ImageView 提供正确的标签。
【讨论】:
我最终选择了 BJ 的方法,因为我更喜欢子类化而不是标签管理,但我很欣赏这个答案。 :)【参考方案2】:最简单的解决方案可能只是继承 UITableViewCell 以添加跟踪属性。像这样的:
@interface TrackingTableViewCell : UITableViewCell
@property (strong) id trackingValue;
@end;
@implementation TrackingTableViewCell
// Default @synthesize as of Xcode 4.4!
@end
当您设置单元格时,将 trackingValue 设置为您从中下载 URL 的 NSURL
。完成加载图像后,检查可见单元格的 trackingValue。如果你找到一个匹配的,很好。如果没有,请不要在任何地方设置。
理论上你可以用objc_setAssociatedObject()
API 做同样的事情,但我并没有真正看到这样做的价值,而不仅仅是创建一个简单的子类来为你跟踪价值。
【讨论】:
我喜欢这个主意。相关:您如何找出正在显示的表格视图?还是我应该总是搜索它们? 您可以向两个 tableViews 询问 -indexPathForCell:,以快速确定单元格在哪个(如果有)可见。 谢谢。答案很好。我最终选择了UITableView *tableToSearch = self.searchDisplayController.active ? self.searchDisplayController.searchResultsTableView : self.tableView;
并在其 visibleCells 中搜索正确子类的单元格,然后按照您的建议比较跟踪值。以上是关于从背景更新过滤表中的单元格?的主要内容,如果未能解决你的问题,请参考以下文章