2012-07-25 53 views
0

我有一张显示图像的表格。它可以被实时搜索,它可以调整显示的单元格。当图像尚未立即可用时,图像将在网络中使用并发NSOperation子类在网络中加载。从背景更新过滤表格中的单元格?

获取图像后,我想更新表格以显示它。

如何更新正确的单元格?

  • 我不能依靠我在tableView:cellForRowAtIndexPath:中构建的单元格,因为单元格可能已被重新用于另一行。
  • 我不能依靠传递到tableView:cellForRowAtIndexPath:indexPath,因为它可能在更新开始后由于搜索项更改而发生更改。
  • 我无法搜索表格中的可见单元格,因为单元格本身是UITableViewCell的实例并且没有元数据。
  • 我无法搜索我的过滤列表,因为我不知道要将更改应用于哪个表。

我错过了什么?

回答

1

最简单的解决方案可能只是为了添加一个跟踪属性的子类UITableViewCell。事情是这样的:

@interface TrackingTableViewCell : UITableViewCell 
@property (strong) id trackingValue; 
@end; 

@implementation TrackingTableViewCell 
// Default @synthesize as of Xcode 4.4! 
@end 

当您设置单元格中,trackingValue设置为NSURL你从网上下载的URL。当您完成加载图像时,请检查可见单元格的trackingValue。如果你找到一个匹配,很好。如果没有,请不要放在任何地方。

理论上你可以使用objc_setAssociatedObject() API做同样的事情,但我并没有真正看到在创建一个简单的子类来跟踪你的值时做这件事的价值。

+0

我喜欢这个想法。相关:如何找出正在显示哪个tableview?或者我应该总是搜索他们两个? – 2012-07-25 22:02:52

+0

您可以同时询问两个tableViews的-indexPathForCell :,以快速确定哪一个(如果有的话)单元格可见。 – 2012-07-25 22:14:20

+0

谢谢。答案很好。我结束了'UITableView * tableToSearch = self.searchDisplayController.active? self.searchDisplayController.searchResultsTableView:self。tableView;'并搜索它的visibleCells以获得正确的子类的单元格,然后根据您的建议比较跟踪值。 – 2012-07-25 22:34:10

2

我在应用程序商店中的应用程序中执行此确切操作。我在视图控制器中创建了一个通知处理程序,当图像到达时会得到通知。该图像具有与其关联的标记 - 我可以将其映射到需要它的视图。

创建单元格时,我将UIImageView添加到contentViews数组中,并使用与图像相关联的标签相匹配的唯一标签(并且可以用10,000来抵消这些标签以避免冲突)。

然后我问UITableView的可见细胞数组。我遍历它们,要求每个单元格的contentView都有一个viewWithTag:tag(唯一标签)。如果找到,我有正确的UIImageView,并设置图像。

显然,当向tableView提供单元格时,必须始终向ImageView提供适当的标记。

+0

我最终选择了BJ的方法,因为我更喜欢使用子类来标记管理,但我很欣赏答案。 :) – 2012-07-25 22:35:08