0

我有一个具有标记类型属性的 customTableViewCell。我使用这个对象来绑定 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;

如果我从 Web 服务获取的信息有更多信息,我想更新此单元格。

所以我在我的 tableview 中得到了对象的 indexPath,然后我试试这个:

- (void)updateIndexPath:(NSIndexPath *)indexPath marker:(Marker *)marker {
    MarkerTableViewCell *cell = (MarkerTableViewCell *)[self.MarkersTableView cellForRowAtIndexPath:indexPath];

对于我的 tableView 的第一部分,这cell.marker就是我所期望的。然而,在其他部分,cell.marker为零。是否有一个原因?谢谢。

4

1 回答 1

2

UITableView 的工作原理是它只包含当前显示的单元格,仅此而已。因此,如果您尝试访问的单元格不在视图中,那么您将一无所获(或者可能是垃圾,因为单元格被重用了)。

我发现处理这种情况的唯一方法是使用数据数组。不要将标记绑定到单元格,而是将标记绑定到您的数据数组。然后,当您的网络服务为您提供更新的信息时,您会在数组中找到该标记并更新您需要的任何内容。这样,无论单元格是否在屏幕上,您的数据源都会更新。如果它在屏幕外,那么下次它出现在屏幕上时,代码将调用 cellForRowAtIndexPath 并且您的数据源会将更新的信息传递给它。

长话短说,您的数据源是唯一可以找到所有数据并且操作系统不会释放它以节省内存的地方。

于 2013-02-01T19:57:37.313 回答