gpt4 book ai didi

ios - TableView :cellForRowAtIndexPath called with nil indexPath after deleting item

转载 作者:技术小花猫 更新时间:2023-10-29 10:10:54 25 4
gpt4 key购买 nike

我有一个由 NSFetchedResultsController 管理的相当普通的 UITableView 来显示给定核心数据实体的所有实例。

当用户通过滑动删除 TableView 中的条目时,tableView:cellForRowAtIndexPath: 最终会在我的 UITableViewController 上被调用,并返回 nil 索引路径。由于我没有预料到会使用 nil indexPath 调用它,因此应用程序崩溃了。

我可以通过检查该 nil 值然后返回一个空单元格来解决崩溃问题。这似乎有效,但我仍然担心我可能处理错了。有任何想法吗?有没有人见过 tableView:cellForRowAtIndexPath:nil indexPath 调用?

请注意,这仅在用户通过滑动单元格从 TableView 中删除时发生。使用 TableView 编辑模式删除项目时,不会发生这种情况。这两种删除单元格的方法有何不同?

那么在 TableView 委托(delegate)方法中获取 nil indexPath 真的可以吗?

我的 View Controller 代码非常标准。这是删除:

- (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 委托(delegate)方法被调用:

- (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];
}

非常感谢。

最佳答案

您似乎正在从表中删除 indexPath,但表数据源未更新。您是否验证了 NSFetchedResultsController 的数据源更新过程是否正确更新了表数据源。?

关于ios - TableView :cellForRowAtIndexPath called with nil indexPath after deleting item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com