Сбой приложения iPhone на [self.tableView endUpdates] - PullRequest
9 голосов
/ 29 августа 2010

В моем табличном представлении отображается список пользователей. У меня проблемы с обновлением представления таблицы после добавления пользователя. Я пробовал разные комбинации кода и событий, и теперь приложение зависает при вызове endUpdates. Приложение моделируется после приложения рецепта, поэтому пользователь нажимает кнопку добавления, и затем появляется модальное окно с запросом имени пользователя. Затем он переходит к экрану редактирования, а затем возвращается к списку пользователей. В этот момент новый пользователь не появился. Но если я вернусь к главному экрану, а затем вернусь к экрану пользователей, появится пользователь.

Вот мой код:

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    sectionInsertCount = 0;
    [self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
  [self.tableView endUpdates];

}

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

  case NSFetchedResultsChangeInsert:
            if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) {
                [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
                sectionInsertCount++;
            }

   break;
  case NSFetchedResultsChangeDelete:
            if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1) )) {
                [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
                sectionInsertCount--;
            }

   break;
        case NSFetchedResultsChangeMove:
            break;
        case NSFetchedResultsChangeUpdate: 
            break;
        default:
            break;
 }
}

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
 switch(type) {
  case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
   break;
  case NSFetchedResultsChangeDelete:
   [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
   break;
        case NSFetchedResultsChangeUpdate: {
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
  case NSFetchedResultsChangeMove:
            if (newIndexPath != nil) {

                NSUInteger tableSectionCount = [self.tableView numberOfSections];
                NSUInteger frcSectionCount = [[controller sections] count];
                if (frcSectionCount != tableSectionCount + sectionInsertCount)  {
                    [self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone];
                    sectionInsertCount++;
                }


                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath]
                                     withRowAnimation: UITableViewRowAnimationRight];

    runEndUpdates = NO;

            }
            else {
                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade];
            }
   break;
        default:
   break;
 }
}

Я почти на грани с этим. CoreData была самой расстраивающей частью разработки приложений. Должен ли я просто перейти на SQL Lite? Или у меня все еще будут те же проблемы?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 30 августа 2010

По моему опыту, некоторые строки или разделы должны быть вставлены или удалены между beginUpdated и endUpdated. Если между beginUpdated и endUpdated не было вставлено или удалено ни одной строки или раздела, произойдет сбой.

И, если номер раздела и номер строки не верны, он тоже будет зависать. Так что кодирование нужно очень аккуратно.

2 голосов
/ 12 октября 2013

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

В моем табличном представлении есть несколько событий, отсортированных по дате.События запрашиваются из веб-API 50 одновременно.Каждый раз, когда делается новый запрос, извлекаемые результаты обновляются, и новые ячейки включаются в анимацию. Раньше я замечал много странных сдвигов, когда добавлялись новые строки, но позже это казалось чем-то вроде оптимизации.

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

О, да, мне также нужен дескриптор для времени начала.Это то, что сделает приложение более привлекательным для использования.

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

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

2 голосов
/ 01 ноября 2011

Сегодня у меня была та же проблема.

Проблема была в моем исходном коде - одна из функций UITableViewDataSource использовала недопустимый объект (не объект CoreData, простой массив, который я забыл сохранить), это вызвало сбой,К сожалению, это не было ясно из стека вызовов, в консоли не было предоставлено никаких сообщений.

Так что причина может заключаться в реализации протокола UITableViewDataSource.

0 голосов
/ 29 августа 2010

Попробуйте вызвать [self.tableview reloaddata] внутри controllerDidChangeContent.

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