我有UITableView
使用2 NSFetchedResultsControllers
。每个NSFetchedResultsController
只有一个部分。但是,该表有4个部分。我使用NSFetchedResultsControllers
之一的结果填充表格的第4部分。到目前为止一切正常。但是,如果用户删除第一部分中的第一个单元格,则会更改NSFetchedResultsControllers
。表的最后一部分中的行可能会被删除。调用此方法时:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
NSLog(@"section: %d, row: %d", [newIndexPath section], [newIndexPath row]);
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
...
}
该部分始终为0,因为它是NSFetchedResultsControllers
的部分。因此,该部分与表视图中的正确部分不匹配。
有解决方法吗?我基本上想将NSFetchedResultsController
的部分更改为3而不是0。
答案 0 :(得分:2)
我找到了一种解决方法,但是有一个更漂亮的解决方案会很好。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
if (newIndexPath != nil && controller == self.fetchedXController) {
newIndexPath = [NSIndexPath indexPathForRow:[newIndexPath row] inSection:3];
if ([tableView cellForRowAtIndexPath:newIndexPath] == nil) {
type = NSFetchedResultsChangeInsert;
}
}
if (indexPath != nil && controller == self.fetchedDomainsController) {
indexPath = [NSIndexPath indexPathForRow:[indexPath row] inSection:3];
}
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:newIndexPath] atIndexPath:newIndexPath];
break;
...