gpt4 book ai didi

iphone - 由于自引用连接,从 UITableView 删除时应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 20:00:30 25 4
gpt4 key购买 nike

我是 iPhone 开发的新手(这里发布了第一个问题),并且对核心数据和表格 View 有些困惑。

简而言之,当我从 UITableView 中删除一行时,由于对因自引用表上的级联删除而已删除的记录调用 NSFetchedResultsChangeUpdate,我的应用程序崩溃了。

以下是数据模型的描述:

有两个实体; 联系

包含名称(字符串)、连接(与的多个关系)连接->源,级联删除规则)和connectedby(与连接->连接的多个关系,级联删除规则)

连接包含关系(字符串)、(与人<的关系)/strong>->connections,使删除规则无效)和connection(与->connectedby的关系,使删除规则无效)

这个想法是两个人通过某种关系联系在一起(例如母亲儿子)

在我的 TableViewController 中,我实现了以下内容:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
Person *person = nil;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
person = (Person *)[fetchedResultsController objectAtIndexPath:indexPath];
[self configureCell:(PersonTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
person = (Person *)[fetchedResultsController objectAtIndexPath:indexPath];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}

以下是我为测试此功能而创建的示例记录:

Person *person1 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
[person1 setName:[NSString stringWithFormat: @"Tommy"]];

Person *person2 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
[person2 setName:[NSString stringWithFormat: @"Jane"]];

Connection *connection = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:managedObjectContext];
[connection setConnection:person2];
[connection setSource:person1];
[connection setRelationship:[NSString stringWithFormat:@"Mother"]];

Connection *connection2 = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:managedObjectContext];
[connection2 setConnection:person1];
[connection2 setSource:person2];
[connection2 setRelationship:[NSString stringWithFormat:@"Son"]];

当我删除indexPath[0,0]处的记录时,即本例中的Jane,因为 View 是按名称排序的,我生成以下错误:

2010-10-19 16:09:01.461 HelpMe[6324:207] 
Serious application error.
Exception was caught during Core Data change processing.
This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.
*** -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0] with userInfo (null)
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] in image CoreData.

删除似乎正确地为indexPath [0,0]生成一个NSFetchedResultsChangeDelete,但也立即为[0,1]生成一个NSFetchedResultsChangeUpdate,它不再存在,因为[0,1]现在似乎在[0,0]中删除后。

如果没有关联的连接记录,它可以很好地删除。

我似乎可以通过简单地在controllerDidChangeContent上调用[self.tableView reloadData]来解决这个问题,而不是实现开始/结束更新和didChangeOnject:但我不认为这是处理这个问题的正确方法。

我感谢任何人可以提供的任何帮助。

最佳答案

我通过向 NSFetchedResultsController(在 initWithFetchRequest 中)提供非零 sectionNameKeyPath 解决了类似的问题。

然后我使用以下方法避免了部分:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return @"";
}

非常烦人。

仅供引用,我的问题是这个错误:

Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. * -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array with userInfo (null)

关于iphone - 由于自引用连接,从 UITableView 删除时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973625/

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