我有一个customTableViewCell,它具有Marker类型的属性。我使用此对象绑定UI元素,例如UILabel。
我有一个TableSection对象,我基本上只是用于分组表来帮助更好地管理事物。它看起来像:
@interface TableSection : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSMutableArray *array;
在我的cellForAtIndexPath方法中,我这样做:
TableSection *tableSection = [self.markersList objectAtIndex:indexPath.section];
Marker *m = (Marker *)[tableSection.array objectAtIndex:row];
cell.marker = m;
如果我从网络服务获取的信息包含更多信息,我想更新此单元格。
所以我在tableview中获取了对象的indexPath,然后我尝试了这个:
- (void)updateIndexPath:(NSIndexPath *)indexPath marker:(Marker *)marker {
MarkerTableViewCell *cell = (MarkerTableViewCell *)[self.MarkersTableView cellForRowAtIndexPath:indexPath];
对于tableView的第一部分,cell.marker
正是我所期望的。但是,在其他部分中,cell.marker
为零。是否有一个原因?感谢。
答案 0 :(得分:2)
UITableView的工作原理是它只包含当前显示的单元格,仅此而已。因此,如果您尝试访问的单元格不在视图中,那么您将不会得到任何东西(或者可能是垃圾,因为单元格被重用)。
我发现处理这种情况的唯一方法是使用数据数组。而不是将标记绑定到单元格而不是将标记绑定到数据数组。然后,当您的Web服务为您提供更新的信息时,您可以在阵列中找到该标记并更新所需内容。这样,无论细胞是否在屏幕上,您的数据源都将被更新。如果它在屏幕外,那么下次它到屏幕时,代码将调用cellForRowAtIndexPath,您的数据源将把更新的信息传递给它。
简而言之,您的数据源是唯一可以找到所有数据并且操作系统不会释放它以节省内存的地方。