Как обновить UITableViewController или NSFetchedResultsController? - PullRequest
9 голосов
/ 20 июня 2010

У меня небольшая проблема с моим UITableViewController или NSFetchedResultsController.Я не уверен, в чем проблема, но я предполагаю, что это UITableViewController.

Как я уже сказал, я использую NSFetchedResultsController для заполнения своих данных в UITableViewController.Данные сортируются по дате, а также отображаются в разделах по дате-году, например, май 2010 / июнь 2010 / и так далее.Это отображается как заголовок раздела.

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

Так что мне как-то нужно иметь возможность обновить свой список или обновить его.Просто добавив его в контекст и изменив его, похоже, не обновить его.

Опять же, я не уверен, что мне нужно обновить, если это мой объект NSFetchedResultsController или UITableViewController.

ОБНОВЛЕНИЕ № 1:

Я только что понял, что в этом методе есть исключение:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];

}

Вот куда я перемещаю данные:

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

    UITableView *tableView = self.tableView;

    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:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];

            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            // Reloading the section inserts a new row and ensures that titles are updated appropriately.
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }

}

ЭтоМетод в значительной степени взят из примера CoreDataBooks от Apple.И это ошибка:

Серьезная ошибка приложения.Исключение было получено от делегата NSFetchedResultsController во время вызова -controllerDidChangeContent :.*** - [NSMutableArray removeObjectAtIndex:]: индекс 1 за пределами [0 .. 0] с userInfo (null)

И после этого режим редактирования (где появляется кнопка удаления) не работаетработать больше.

Спасибо.

Ответы [ 3 ]

15 голосов
/ 20 июня 2010

Хорошо, похоже, я нашел решение, я просто пропускаю эти

[self.tableView beginUpdates];
[self.tableView endUpdates];

и всегда делаю это.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{

[self.tableView reloadData];

}

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

2 голосов
/ 04 октября 2010

Принимая исправление Apple в iPhoneCoreDataRecipes в версии 1.2, нужно заменить

 // Reloading the section inserts a new row and ensures that titles are updated appropriately.
 [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];

с

    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

(FileMerge - твой друг!)

Обратите внимание, что в версии 1.2 есть еще одно исправление, которое предотвращает ошибочные сбои при создании новых записей. Я сообщил об этом, и это было исправлено в течение двух недель. Я рекомендую вам отправлять отчеты об ошибках в Apple. Они гораздо более отзывчивы, чем вы думаете, и вы можете рассчитывать на лучшее из возможных исправлений.

0 голосов
/ 20 июня 2010

Вам необходимо реализовать методы делегата controller:didChangeSection:atIndex:forChangeType:.В нем отправляйте сообщения insertSections:withRowAnimation:, deleteSections:withRowAnimation: и reloadSections:withRowAnimation: в табличное представление в зависимости от сообщаемого типа изменения.

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