我尝试创建一个聚合Feed的应用程序。
我希望在表格视图结束显示单元格时更改Feed状态。
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
Feed* feed = [_fetchedResultsController objectAtIndexPath:indexPath];
if ([feed.read boolValue] == YES) return ;
feed.read = [NSNumber numberWithBool:YES];
[Feed save];
}
我使用NSFetchedResultsController,当我更改feed状态时,我使用reloadRowsAtIndexPath。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type) {
...
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;
...
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
我滚动,使用好didEndDisplayingCell
调用indexPath
,当tableView
结束更新时,它会再次使用下一个didEndDisplayingCell
调用indexPath
。之后,核心数据出现严重错误。
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2] with userInfo (null)
有什么想法吗?
答案 0 :(得分:0)
为什么要更新coreData
中的didEndDisplayingCell
?
通过致电[Feed save]
,您的tableview
将再次开始更新。tableView
会调用didEndDisplayingCell
,因为您重新加载了刚更新的那一行。
所以将代码放在didEndDisplayingCell
方法的其他地方。