【发布时间】:2011-08-04 12:27:53
【问题描述】:
我有一个由NSFetchedResultsController 管理的相当普通的UITableView 来显示给定核心数据实体的所有实例。
当用户通过滑动删除表视图中的条目时,tableView:cellForRowAtIndexPath: 最终会在我的UITableViewController 上调用nil indexPath。由于我没想到它会被 nil indexPath 调用,所以应用程序崩溃了。
我可以通过检查 nil 值然后返回一个空单元格来解决崩溃问题。这似乎可行,但我仍然担心我可能处理了错误的事情。有任何想法吗?有没有人见过tableView:cellForRowAtIndexPath: 用nil indexPath 调用?
请注意,这只发生在用户通过滑动单元格从表格视图中删除时。使用表格视图编辑模式删除项目时,不会发生这种情况。这两种删除单元格的方法有什么不同?
那么在表视图委托方法中获得nil indexPath 真的是一个好的情况吗?
我的视图控制器代码非常标准。这是删除:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.moc deleteObject:managedObject];
NSError *error = NULL;
Boolean success = [self.moc save:&error];
if (!success) { <snip> }
// actual row deletion from table view will be handle from Fetched Result Controller delegate
// [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else { <snip> }
}
这将导致调用NSFetchedResultsController 委托方法:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeInsert: <snip> break;
case NSFetchedResultsChangeUpdate: <snip> break;
case NSFetchedResultsChangeMove: <snip> break;
}
}
当然,数据源方法由NSFetchedResultsController处理,例如:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
非常感谢。
【问题讨论】:
-
您是否验证了所有这些都以预测的顺序被调用?
-
尝试在
tableView:commitEditingStyle:forRowAtIndexPath中的表视图上立即调用reloadData, 保存对托管对象上下文的更改。我遇到了类似的问题并重新加载表格视图修复了它。
标签: ios null nsindexpath uitableview