coredata错误使得tableView无法显示(NSFetchedResultsController)

时间:2011-10-21 05:12:38

标签: xcode uitableview core-data nsfetchedresultscontroller

CoreData: error: Serious application error.  An exception was caught from the delegate of 

NSFetchedResultsController during a call to -controllerDidChangeContent:.  Invalid update: invalid number of sections.  
The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (0), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null)

这样的错误?我怎么知道?我的代码有什么问题..我不明白这个错误..任何人都可以告诉我那是什么?我怎么能解决这个问题呢?

部分的数量始终是1 ..为什么在更新之前它的0开始?在更新之前,如何使表重新确定有1个且只有1个部分?

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [[self.FetchController sections] count];
    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.FetchController sections] objectAtIndex:section];
        /*int numberOfRow=[sectionInfo numberOfObjects]-(self.numberOf20SkipFromtheBeginning*20);
        numberOfRow = MIN(20,numberOfRow);*/
        //int numberOfRow=MIN(100,[sectionInfo numberOfObjects]);
        CalledRowCountingNotYetCallRowForSection=true;
        [self.tableViewA setBounces:YES];

        if([sectionInfo numberOfObjects]>100){
            //[Timer searchCriteriaChanged];
            CLog(@"Something Wrong This NumberOfRow: %d", [sectionInfo numberOfObjects]);
        }


        return [sectionInfo numberOfObjects];
    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        DLog(@"Function TableView AT listnewController");

        CalledRowCountingNotYetCallRowForSection =false;
        if ([self tableView:tableView numberOfRowsInSection:indexPath.section]==0)
        {
            DLog(@"Something is VERY WRONG. Number of Section: %d" ,indexPath.section);
        }
        DLog(@"Indexpath at cellForRowAtIndexPath : %d", indexPath);
        Business * theBiz=[self.FetchController objectAtIndexPath:indexPath];
        return theBiz.CustomCell;

    }

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        DLog(@"Function didselectrowatindexpath listnewcontroller");
        //[BNUtilitiesQuick UtilitiesQuick].currentBusiness=[[self.FetchController fetchedObjects] objectAtIndex:[indexPath row]+self.numberOf20SkipFromtheBeginning*20];
        [BNUtilitiesQuick UtilitiesQuick].currentBusiness=[[self.FetchController fetchedObjects] objectAtIndex:[indexPath row]];
        [BNUtilitiesQuick SafelyPushControllerAtNavigationController:[BNUtilitiesQuick NearbyIsiKota].mDetailBusiness atNavigationController:[BNUtilitiesQuick NearbyIsiKota].navigationController];
    }

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    DLog(@"controllerWillChangeContent: %@", controller);
    [self.tableViewA beginUpdates];

}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    DLog(@"didChangeSection: %@", controller);

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableViewA insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableViewA deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


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

    DLog(@"controller:%@\ndidChangeObject:%@\natIndexPath:%@\nforChangeType:%d\nnewIndexPath:%@\n",controller, anObject, indexPath, type, newIndexPath);

    UITableView *tableView = self.tableViewA;
    DLog(@"%@", self.tableViewA);
    switch(type) {
        case NSFetchedResultsChangeInsert:
                [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationRight];
            break;

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

        case NSFetchedResultsChangeUpdate:

            //[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
            //[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationRight];
            //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            break;

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

}


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

1 个答案:

答案 0 :(得分:2)

这很可能是因为NSFetchedResultsController在不需要NSFetchedResultsController时提供sectionNameKeyPath

如果您提供sectionNameKeyPath但该关键路径尚无值,则获取的结果控制器将报告该表具有零部分。如果该键路径获取值,则获取的结果控制器将报告该表现在具有一个或多个部分。

要修复,请在初始化提取的结果控制器时确保sectionNameKeyPath为空。您还可以通过硬连线numberOfSectionsInTableView:始终返回零或一。