NSFetchResultController Ошибка делегата - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть пара UIViewControllers, которые отображают табличное представление моих объектов «Пользователь» в качестве раздела и объекты «Сайт» в виде строк в каждом разделе. Отношения между сайтом и пользователем: один-ко-многим.

В данный момент я показываю эти данные со следующим кодом:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
    return [sectionInfo numberOfObjects];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    User *sectionUser = (User*)[self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:section inSection:0]];

    return [[sectionUser.sitesToUser allObjects] count];
}

В моем NSFetchResultsController я просто перетаскиваю все объекты пользователя, ничего особенного.

Теперь моя проблема - всякий раз, когда я обновляю результаты, удаляя раздел (то есть пользователя) или добавляя пользователя, пока это представление также открыто, я получаю ошибку делегата NSFetchedResultsController:

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 (2) must be equal to the number of sections contained in the
table view before the update (1), plus or minus the number of sections inserted or
deleted (0 inserted, 0 deleted). with userInfo (null)

Я получаю его только в тех представлениях, где я отображаю свои данные таким образом, это раздел «Пользователь», а «Сайты / и» - строки под каждым разделом.

Я делаю что-то действительно глупое? Я думал, что это будет просто удалить раздел, когда я удаляю его и т. Д ... Кажется, работает нормально, если каждый пользователь является строкой в ​​UITableView - что я считаю, суть моей проблемы ...

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Вы не показали свои вызовы делегатов fetchedResultsController:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
- (void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath
- (void)controller:didChangeSection:sectionInfoAtIndex:forChangeType:

Эти вызовы отвечают за добавление и удаление строк / разделов из вашей таблицы, так что все "складывается" в том, что касается представления таблицы.

В вашем случае вы как бы "злоупотребляете" тем, что такое раздел, поэтому этот код может стать хитрым.

Если вы готовы обходиться без анимации, вы можете просто реализовать:

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

Daniel.

0 голосов
/ 09 сентября 2011

Я использую базовые данные, но мой код для метода numberOfSectionsInTableView: и tableView:numberOfRowsInSection: отличается ... Я не знаю, может ли это решить вашу проблему, но попробуйте использовать этот код:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger rowsNumber = 0;
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    rowsNumber = [sectionInfo numberOfObjects];
    return rowsNumber;
}

Для разделов я никогда не использовал его, но попробуйте поработать с аргументом sectionNameKeyPath initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName: при инициализации контроллера.

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