Lut*_*ker 10 iphone core-data uitableview nsfetchedresultscontroller
NSFetchedResultsControllerDelegate的文档提供以下示例代码
- (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:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个新的NSManagedObject时,NSFetchedResultsChangeInsert会触发(太棒了!).当我更改属性的值(用于单元格的标题)时,NSFetchedResultsChangeUpdate将触发.不幸的是,除非我重新加载表格,部分或行,否则新标题不会自动显示.实际上,如果新名称导致结果集排序不同,那么NSFetchedResultsChangeMove会触发,因为提供的代码会重新加载整个部分,所以一切都很好.
的UITableView有一个方法reloadRowsAtIndexPaths:withRowAnimation所以我试图下使用该NSFetchedResultsChangeUpdate代码块.它确实有用......但是这个特定方法的文档读起来好像我不需要它(注意最后一行):
重新加载行会导致表视图向其数据源询问该行的新单元格.该表动画化了新单元格,因为它为旧行设置了动画.如果要提醒用户单元格的值正在更改,请调用此方法.但是,如果通知用户并不重要 - 也就是说,您只想更改单元格显示的值 - 您可以获取特定行的单元格并设置其新值.
是的,如果我记录发生了什么,何时
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
Run Code Online (Sandbox Code Playgroud)
在NSFetchedResultsChangeUpdate上调用它,它能够检索最新的"名称"值并将其设置在单元格的textLabel中.除非重新加载,否则名称不会在单元格中呈现.即使我只是单击名称显示的单元格.请注意,要重新创建此行为,您必须创建一个新的托管对象,然后为其指定一个名称,使其在NSFetchedResultsController中对FIRST进行排序.这样,NSFetchedResultsChangeMove不会触发(因为它重新加载该部分,它确实有效).
我错过了什么或这是预期的行为吗?reloadRowsAtIndexPaths的'讨论' 让我相信我应该能够简单地设置单元格的textLabel而无需重新加载行,部分或表格.
您应该调用[cell setNeedsLayout]or/and[cell setNeedsDisplay]来刷新单元格,具体取决于单元格的实现。
如果你像我们通常那样组成子视图的单元格,那么你依赖于- layoutSubviews,所以你应该调用[cell setNeedsLayout]。
如果直接使用 绘制单元格\xe2\x80\x93 drawRect:,则应该调用[cell setNeedsDisplay].
如果您同时使用构图和绘图,则应该同时调用两者。
\n| 归档时间: |
|
| 查看次数: |
4075 次 |
| 最近记录: |