我有一个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;
}
答案 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;
}
}