2013-11-03 63 views
0

我想從一個NSFetchedResultController從TableView中刪除行,我已經閱讀了很多關於如何做到這一點的例子,我無法弄清楚我做錯了什麼。我需要幫助。使用NSFetchedResultController刪除行在索引沒有對象

這是我得到的錯誤:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0' 

這是我刪除代碼:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSLog(@"Deleting object at row %d", indexPath.row); 

    // DeleteObject 
    NSManagedObject *objToDelete = (NSManagedObject*)[self.fetchedResultsController objectAtIndexPath:indexPath]; 

    // Delete 
    [self.fetchedResultsController.managedObjectContext deleteObject:objToDelete]; 

    NSError *error = nil; 
    [self.fetchedResultsController.managedObjectContext save:&error]; 
    if(error) 
    { 
     NSLog(@"DeleteRow caused : %@", error); 
    } 
} 

這是我fetchController

- (NSFetchedResultsController *)fetchedResultsController { 


    AppDelegate *appdelegate = [[UIApplication sharedApplication]delegate]; 
    context = [appdelegate managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Dagbok" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 


    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
           initWithKey:@"header" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:40]; 
    [fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"relationship", nil]]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:context sectionNameKeyPath:nil 
                cacheName:@"Root"]; 
    _fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    NSArray *matchingdata = [context executeFetchRequest:fetchRequest error:nil]; 


    return _fetchedResultsController; 

} 

這是我ObjectChanged

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 


    UITableView *tableView = _tabell; 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:(VallaDagbokCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray 
               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray 
               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 

回答

0

看來你已經消除了獲取結果控制器的延遲加載。因此,不清楚FRC getter中的提取請求的執行時間。看起來像這樣發生之前該行被委託方法刪除。

嘗試重新插入原來的延遲加載代碼段修復您的FRC的getter:

if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 
相關問題