无需重新定位UITableViewCell即可重新加载UITableView数据

时间:2012-07-26 19:33:35

标签: ios layout uitableview nsfetchedresultscontroller

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

我的部分UI也可以让细胞水平重新定位。我希望每次刷新表的数据时都不会重新定位这些单元格,但不幸的是,[tableview reloadData]就是这样。

更新tableview中的数据而不重新定位行的理想方法是什么?我应该覆盖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:,并且从dequeue返回的单元格的原点是(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;
}

1 个答案:

答案 0 :(得分: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;
  }
}