2014-03-13 53 views
0

我有問題,將數據保存到CoreData並顯示在表視圖controller.The問題是這個視頻:https://www.youtube.com/watch?v=6Di9zeAeBWs&feature=youtu.be工作與重載CoreData在tableViewController

當我刪除類不發生任何問題。該課程被正確刪除(我的視頻的第一部分)。但是,當我添加一個新類的程序將報告錯誤:

2014-03-13 16:31:02.771 IISForTeachers [30568:70B] CoreData:錯誤:嚴重的應用程序錯誤。在調用-controllerDidChangeContent:期間,NSFetchedResultsController的委託捕獲到異常。無效更新:第0節中的行數無效。更新(3)後現有節中包含的行數必須等於更新前(3)的該節中包含的行數,加上或減去數字插入或從該部分刪除的行(插入0,刪除1)以及加或減移入或移出該部分的行數(移入0,移出0)。與userInfo(空) 2014-03-13 16:31:02.774 IISForTeachers [30568:70b] _context SAVED更改爲持久性存儲。

將錯誤日期保存到持久性存儲之後。數據的保存工作正常,因爲我在桌面視圖控制器中看到新的分區,並且當我停止並再次運行應用程序時,新數據就在那裏。但是當我添加一個新的類並且我想要刪除一個類時,應用程序崩潰(視頻的第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; 

} 

將FRC在CoreDataTVC.h(對於具有表視圖控制器工作的通用類)definet並且被定義爲休耕:

@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)時,應用程序再次顯示錯誤。 這裏是應用程序的行爲對不起視頻的質量: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)。 with 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

您是如何實現FRC委託方法的? – Wain

+0

已添加問題。 – krata

+0

刪除commitForitingStyle中的單元而不是重新加載整個表[tableView deleteRows ... etc] – Tim

回答

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



} 
+0

我試圖使用你的代碼,但現在不工作「簡單」刪除或添加新類後刪除。錯誤是在此屏幕截圖上:https://www.dropbox.com/s/jibpbs99isheij0/Screenshot%202014-03-13%2018.06.17.png – krata

+0

錯誤是說,UITableView仍然包含4行,刪除後已經執行。因此'必須包含加或減在該部分中插入或刪除的行數(刪除1個)。預計會有3排。 – Tim

+0

嗯,但我不知道如何。我用新代碼更新我的問題。謝謝你的幫助。 – krata

相關問題