Базовые данные: изменения в одном UITableView / объекте не распознаются другими «косвенно» связанными UItableviews / entity - PullRequest
0 голосов
/ 24 октября 2011
         appdelegate
     passes modelview 
     to each tab controller
            |
            |
          /    \
         /      \   
        /        \
       /          \ 
      /            \
     /              \
    vc1             vc2
 show list      show grouped  
 of years     table with years
    |          as headers and
    |           courses within
   vc3            each year
list courses
in selected 
year
   |
   |
add new 
course to
selected 
year

В vc1 и vc2 сущность, которую я читаю из своей базовой модели данных, - это "годы".В подпрограммах «numberOfRowsInSection ()» и т. Д. Я получаю доступ к курсам через отношения «ко-многим» в моей модели через NSSet ().(т.е. курсы_рель).Все это прекрасно работает для начального отображения обоих представлений.

vc3 также прекрасно работает.Пользователь может добавить новый курс в любой выбранный год.

Вот моя проблема.Когда пользователь добавляет новый курс через vc3, а затем переключается на vc2, новый курс не отображается, и я получаю сообщение об ошибке, приведенное ниже.Я знаю, что получаю сообщение об ошибке, потому что изменение было внесено в таблицу базы данных курсов, но представление таблицы в vc2 загружается из таблицы "years".Он никогда не получает «didChangeObject» и другие соответствующие сообщения, поскольку имеет дело с «годами», а не с курсами.Тем не менее, тело каждого сгруппированного раздела представляет собой список курсов!

Как получить изменения в таблице курсов (vc3), которые сразу же отражаются при переходе пользователя на vc2?

Iпоместили новую операцию выборки и [view reloadData] в функцию viewWillLoad, но опять же, это выборка лет, а не курсов, поэтому она не имеет никакого эффекта.

Вот ошибка, которую я получаю, когда пользователь переключаетсяпосле добавления курса в vc3.

CoreData: ошибка: серьезная ошибка приложения.Исключение было получено от делегата NSFetchedResultsController во время вызова -controllerDidChangeContent :.Неверное обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (3), должно быть равно числу строк, содержащихся в этом разделе до обновления (2), плюс или минус числоиз строк, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено).с userInfo (null)

Ответы [ 2 ]

1 голос
/ 24 октября 2011

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

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

 NSFetchedResultsController *myController = [[NSFetchedResultsController alloc] 
                                 initWithFetchRequest:<a courses fetch request> 
                                 managedObjectContext:context
                                   sectionNameKeyPath:@"year"
                                            cacheName:<cache name or nil>];

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

0 голосов
/ 14 сентября 2016

У меня было то же сообщение об ошибке от Core Data, но это было решение.

https://developer.apple.com/library/content/releasenotes/iPhone/NSFetchedResultsChangeMoveReportedAsNSFetchedResultsChangeUpdate/

...