2

我有一个从 NSFetchedResultsController 接收数据的 UITableView。NSFetchedResultsController 的数据偶尔会被网络调用更新。每次通过网络调用更新数据后,我都会使用 [tableView reloadData] 更新 UITableView 以添加任何新项目。

我的部分 UI 还使单元格可以水平重新定位。我希望每次刷新表的数据时不要重新定位这些单元格,但不幸的是,[tableview reloadData] 就是这样做的。

在不重新定位行的情况下更新表视图中的数据的理想方法是什么?我应该覆盖 tableview 的 reloadData 方法并在那里做一些花哨的事情,或者可能覆盖 tableview 单元格 layoutSubviews 方法吗?

我像这样定位单元格:

CGRect newFrame = cell.frame;
newFrame.origin.x = -cell.frame.size.width;
cell.frame = newFrame;

在 NSFetched 结果控制器从网络调用中接收到更多数据后,它会调用它的委托方法:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.eventTableView reloadData];
}

调用tableview: cellForRowAtIndexPath:并且从出队返回的单元格的原点位于 (0,0)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath    *)indexPath
{
    static NSString *CellIdentifier = @"EventCell";
    EventCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        [cellNib instantiateWithOwner:self options:nil];
        cell = self.customCell;
    }

    // Configure the cell...
    Event *event = [fetchedResultsController objectAtIndexPath:indexPath];
    [cell configureCellWithEvent:event];

    return cell;
}
4

1 回答 1

0

您可以尝试 UITableViewDelegate 方法tableView:willDisplayCell:forRowAtIndexPath:,该方法在任何单元格添加到表格视图或滚动到表格的可见区域之前调用。在那里,您可以根据需要定位单元格,这将在重新加载后起作用。

这对您的问题不是必需的,但我还建议更改单元格的变换属性而不是其框架。这样一来,您就不会意外地将其移动得比您想要的更远(例如,如果您将其移动两次)。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
  //Determine if the cell should be shifted.
  if (cellShouldShift) {
     cell.transform = CGAffineTransformMakeTranslation(0 - cell.bounds.size.width, 0);
  } else {
     cell.transform = CGAffineTransformIdentity;
  }
}
于 2012-07-26T21:24:39.183 回答