NSFetchedResultsController尝试限制显示的logging数

当创build一个NSFetchedResultsController传递给我的NSFetchedResultsController时,我将fetchLimit属性设置为3。

现在最初这似乎工作正常。 我可以以任何方式修改前三个返回的对象,改变它们的顺序,并且全部重新正确。 当我改变一个最初落在前三个物体之外的物体时,会出现这个问题,现在将其引入前三个物体,或者只是添加一个新的物体,使其出现在前三个物体中。

我期望发生的事情:插入的物体将其余部分向下推,一个从底部落下。

究竟发生了什么:插入的对象将其余部分向下推, logging数增长到4 ?!

任何人都可以解释这个,或者我应该如何处理这个?

我已经取得了一些进展,基本上通过忽略numberOfObjects并返回我希望表固定的实际长度。 这在controller:didChangeObject:...需要一点小controller:didChangeObject:...但似乎到目前为止工作。

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return kTableSize; //return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects]; } - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { UITableView *tableView = self.myTableView; switch(type) { case NSFetchedResultsChangeInsert: // Only modify table if insert will effect visible rows if (newIndexPath.row < kTableSize) { // Delete last row to maintain fixed length [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeDelete: // Only modify table if delete will effect visible rows if (indexPath.row < kTableSize) { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; // Insert extra row to maintain fixed length [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeUpdate: // Only modify table if update will effect visible rows if (indexPath.row < kTableSize) { [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeMove: // Only modify table if move will effect visible rows if ((indexPath.row < kTableSize) || (newIndexPath.row < kTableSize)) { // Delete old row or last row of table if (indexPath.row < kTableSize) { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } else { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } // Insert new row or a row at bottom of table if (newIndexPath.row < kTableSize) { [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } else { [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } } break; } } 

还需要注意tableView:cellForRowAtIndexPath:确保我们不尝试访问一个对象,如果对象比表长度less,就不存在。