Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不重新定位UITableViewCells的情况下重新加载UITableView数据_Ios_Layout_Uitableview_Nsfetchedresultscontroller - Fatal编程技术网

Ios 在不重新定位UITableViewCells的情况下重新加载UITableView数据

Ios 在不重新定位UITableViewCells的情况下重新加载UITableView数据,ios,layout,uitableview,nsfetchedresultscontroller,Ios,Layout,Uitableview,Nsfetchedresultscontroller,我有一个UITableView,它从NSFetchedResultsController接收数据。NSFetchedResultsController的数据偶尔会通过网络调用进行更新。每次从网络调用更新数据后,我都会使用[tableView reloadData]更新UITableView,以便添加任何新项目 “我的UI”的一部分还允许水平重新定位单元格。我不希望每次刷新表的数据时都重新定位这些单元格,但不幸的是,[tableview reloadData]正是这样做的 更新tableview中

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

“我的UI”的一部分还允许水平重新定位单元格。我不希望每次刷新表的数据时都重新定位这些单元格,但不幸的是,[tableview reloadData]正是这样做的

更新tableview中的数据而不重新定位其行的理想方法是什么?我应该重写tableview的reloadData方法并在那里做一些有趣的事情,还是重写tableview的cells layoutSubviews方法

我将单元格定位为:

CGRect newFrame = cell.frame;
newFrame.origin.x = -cell.frame.size.width;
cell.frame = newFrame;
NSFetched Results Controller从网络调用接收到更多数据后,将调用其委托方法:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.eventTableView reloadData];
}
调用tableview:cellforrowatinexpath:并且从出列返回的单元格的原点位于(0,0)


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

这对你的问题不是很重要,但我也建议改变单元格的变换属性,而不是它的帧。这样,您就不会意外地将其移动到超出您希望的距离(例如,如果您将其移动两次)


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

这对你的问题不是很重要,但我也建议改变单元格的变换属性,而不是它的帧。这样,您就不会意外地将其移动到超出您希望的距离(例如,如果您将其移动两次)


你能说得更具体些吗?可能会发布一些关于这种重新定位是如何发生的代码,否则很难提出替代方案。@Dima没有太多代码可发布,因为大部分代码都发生在苹果的
[tableView reloadData]
实现中。我通过修改单元格的帧来移动单元格,当我调用
[tableView reloadData]
时,从
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]
返回的单元格的原点位于(0,0)。可能有更好的方法,但是,为单元创建一个自定义视图,然后让单元侦听更新并更新自身,怎么样?您能更具体一点吗?可能会发布一些关于这种重新定位是如何发生的代码,否则很难提出替代方案。@Dima没有太多代码可发布,因为大部分代码都发生在苹果的
[tableView reloadData]
实现中。我通过修改单元格的帧来移动单元格,当我调用
[tableView reloadData]
时,从
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]
返回的单元格的原点位于(0,0)。可能有更好的方法,但是,为单元格创建一个自定义视图,然后让单元格侦听更新并更新自身怎么样?此方法在cellForRowAtIndexPath之后调用,此时单元格已设置为其原点。因此,如果我知道之前是否移动过细胞,我可以在那里完成同样的事情。困难的部分是要弄清楚电池在重新加载之前是否移动过。我想我可以在单元格上保留某种标记属性,但这似乎有点不方便。是否可以在需要时插入行(使用
insertRowsAtIndexPaths:withRowAnimation:
),而不是重新加载表视图?如果没有,你可能不得不求助于一些黑客手段。我想我必须求助于一些黑客手段,因为网络呼叫也包含更新已经存在的单元格用户界面的信息:(此方法在cellForRowAtIndexPath之后调用,此时单元格已设置为其原点。因此,如果我知道单元格之前是否已移动,我可以在那里完成相同的操作。困难的部分是确定单元格在重新加载之前是否已移动。我想我可以保留某种标记属性在单元格上显示rty,但这似乎有点粗糙。是否可以插入行(使用
insertRowsAtIndexPaths:withRowAnimation:
)什么时候需要而不是重新加载表视图?如果不需要,您可能不得不求助于黑客。我想我必须求助于黑客,因为网络调用也包含更新已存在单元格UI的信息:(
- (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;
}
- (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;
  }
}