2010-06-19 3 views
9

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

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

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

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

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

UPDATE # 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 (нуль)

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

Спасибо.

ответ

0

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

+0

То, что я добавил в вопрос ..., после этого возникает исключение. – elementsense

+0

Вы даже не упоминаете 'controller: didChangeSection: atIndex: forChangeType:'. –

+0

isnt -controller: didChangeObject: atIndexPath: forChangeType: newIndexPath делает то же самое? – elementsense

15

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

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

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

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

[self.tableView reloadData]; 

} 

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

+3

Я говорил с инженером Apple в WWDC об этом. Он сказал, что это ошибка в UITableView (исправлена ​​в 4.0). Если вы находитесь на <4.0, просто вызовите 'reloadData' таким образом. Если вы находитесь на> = 4.0, сделайте это, как говорится в документации. –

+0

спасибо, отлично работаю. – tesmojones

+1

Вы, сэр, просто решили проблему, истекающую кровью, на 6-й час. Если бы я мог дважды повышать, я бы это сделал. – Cyprus106

2

Принятие исправления 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. Они гораздо более отзывчивы, чем вы думаете, и вы можете рассчитывать на лучшее исправление.