ошибка coredata Сделать невозможным отображение tableView (NSFetchResultsController) - PullRequest
0 голосов
/ 21 октября 2011
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 Ответ

2 голосов
/ 21 октября 2011

Это, скорее всего, вызвано предоставлением sectionNameKeyPath для NSFetchedResultsController, когда он не нужен.

Если вы укажете sectionNameKeyPath, но для этого ключевого пути еще нет значений, контроллер извлеченных результатов сообщит, что таблица имеет нулевые секции.Если этот путь ключа получает значение, контроллер извлеченных результатов сообщит, что в таблице теперь есть один или несколько разделов.

Чтобы исправить, убедитесь, что sectionNameKeyPath пусто при инициализации контроллера извлеченных результатов.Вы также можете использовать numberOfSectionsInTableView:, чтобы всегда возвращать ноль или единицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...