我在将数据保存到CoreData并在表格视图控制器上显示时遇到问题。此视频存在问题:https://www.youtube.com/watch?v=6Di9zeAeBWs&feature=youtu.be
当我删除类时不会出现任何问题。该类被正确删除。(我的视频的第1部分)。但是当我添加一个新类时,程序报告错误:
2014-03-13 16:31:02.771 IISForTeachers [30568:70b] CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:第0节中的行数无效。更新(3)后现有部分中包含的行数必须等于更新前该部分中包含的行数(3),加上或减去数字从该部分插入或删除的行(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。使用userInfo(null) 2014-03-13 16:31:02.774 IISForTeachers [30568:70b] _context SAVED更改为持久存储。
错误之后将日期保存到持久性存储中。数据保存工作正常,因为我在表视图控制器中看到新的clas,当我再次停止并运行应用程序时,新数据就在那里。但是当我添加一个新类并且我想删除一个类时,应用程序崩溃(视频的第2部分)。
当我再次运行应用程序时,新类在表格视图中,我将其删除而没有问题(第3部分)。
这是我删除单元格的函数代码:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
if (editingStyle == UITableViewCellEditingStyleDelete) {
SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
[[class managedObjectContext] deleteObject:class];
}
[cdh saveContext];
[self.tableView reloadData];
}
FRC
在ClassesTVC.m中获取日期(表视图控制器,其中显示所有类)。
-(void)configureFetch{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES], nil];
[request setFetchBatchSize:50];
self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:cdh.context
sectionNameKeyPath:nil
cacheName:nil];
self.frc.delegate = self;
}
在CoreDataTVC.h(用于表视图控制器的通用类)中,frc是definet,并被定义为fallows:
@property (strong, nonatomic) NSFetchedResultsController *frc;
那里(CoreDataTVC)也是一个函数performFetch:
-(void)performFetch{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
if(self.frc){
[self.frc.managedObjectContext performBlock:^{
NSError *error = nil;
if(![self.frc performFetch:&error]){
NSLog(@"Failed to perform fetch: %@", error);
}
[self.tableView reloadData];
}];
}
else{
NSLog(@"Failed to fetch, the fetched results controller is nil.");
}
}
编辑-----------
我更改了我的代码,现在删除行的功能如下:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
[[class managedObjectContext] deleteObject:class];
[tableView endUpdates];
}
[cdh saveContext];
[self.tableView reloadData];
}
现在应用程序运行良好,但只有当我插入一个输入(classname)时。当我插入类名和classteacher为空时,我可以删除任何有问题的单元格。但是,当我插入两个输入(classname,classteacher)时,应用程序再次显示错误。 以下是应用行为,对于视频质量感到抱歉:https://www.youtube.com/watch?v=PqSxqjuyZbU&feature=youtu.be
错误相同:
2014-03-14 12:15:08.309 IISForTeachers [35735:70b] CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:第0节中的行数无效。更新(5)后现有部分中包含的行数必须等于更新前该部分中包含的行数(5),加上或减去数字从该部分插入或删除的行(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。 userInfo(null)
这是将texfield分配给对象类类型的代码。我不知道哪里可能有问题。谢谢你的帮助。
-(void)textFieldDidEndEditing:(UITextField *)textField{
if (debug == 1) {
NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *)[[UIApplication sharedApplication]delegate]cdh];
SchoolClass *class = (SchoolClass*) [cdh.context existingObjectWithID:self.selectedClassID error:nil];
if(textField == self.classNameTextField){
if([self.classNameTextField.text isEqualToString:@""])
{
self.classNameTextField.text = @"Nova trida";
}
class.name = self.classNameTextField.text;
}
else if (textField == self.classTeacherTextField){
class.classTeacher = self.classTeacherTextField.text;
}
}
答案 0 :(得分:0)
删除单元格时会相应地更新您的视图,错误会告诉您UITableView的预期结果。
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
[[class managedObjectContext] deleteObject:class];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[cdh saveContext];
[tableView endUpdates];
}
}