【发布时间】:2014-08-03 09:47:15
【问题描述】:
我有UITableViewController 表并使用NSFetchedResultsController 从Core Data 获取行。我的tableView 负责分层数据。每个行位置表示层(在零行最高层,n - 最低行)。假设我们有名称为Layers *layers 的对象。当我创建新层时,它需要转到表中的第一行(indexPath.row == 0)并且需要获取layers.layer.position = 0。当我创建新层或进行其他一些更改(移动、删除)时,我需要刷新核心数据对象layers(每个层都需要获取新的位置值)。但是,如果我通过在controllerDidChangeContent 方法旁边调用[self updateLayersPosition] 方法来刷新图层位置,它会进入无限循环,因为每次更改每个旧图层值时,它都会一次又一次地返回到相同的controllerDidChangeContent 方法。所以问题是如何“绑定”表行或获取的控制器indexPath.row 和layers.layer.position?也许我可以停止fetchedresultscontroller 获取,进行更新然后再次开始获取?或者也许有其他方法可以做到这一点?
代码如下:
-(void)updateLayers{
for (int i = 0; i < [self.tableView numberOfRowsInSection:0]; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i
inSection:0];
((Layer *)[self.fetchedResultsController objectAtIndexPath:indexPath]).layer.position = i;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self updateLayers];
[self.tableView endUpdates];
}
【问题讨论】:
-
您不能对
controllerDidChangeContent:中的上下文进行任何更改,这显然会导致无限循环。 -
那么在哪里可以安全地调用该方法?
-
取决于您对应用程序的编程方式。不过不在这里。
-
但是如果我想让 UITableViewController 负责“分层”,那么其他类中就不需要我的代码了。如果我向图层对象添加新图层会很好,这个 UITableViewController 类为我做分层。那么我需要使用 NSFetchedResultsController 或 UITableViewController 的什么方法来更改具有 indexPath.row 值依赖关系的 layers.layer.position 值?
标签: ios uitableview core-data nsfetchedresultscontroller infinite-loop