0

У меня есть раскадровка, который выглядит следующим образом:Обновление CoreData и UINavigationController стеки

Резюме Список -> Рекурсивный Table View -> Пункт Просмотр

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

Summary List -> Recursive Table View -> Item View 
    | 
    | <- (make a change here, use beginUpdate and endUpdate) 
    | 
Core Data 

Этот бит работает отлично ...

Что должно произойти в том, что, когда один попадает в пункт Просмотр ядра объекты данных обновляются и пункт View затем появится на следующей загрузке сводного списка.

Однако, по какой-то причине Сводный список по-прежнему обновляется в фоновом режиме, я предполагаю, что он находится в иерархии навигации, и поэтому, когда я обновляю объекты CoreData на доске элемента, я получаю классическую ошибку CoreData: Серьезная ошибка приложения. Исключение было обнаружено у делегата NSFetchedResultsController во время вызова -controllerDidChangeContent '- обычно я бы обратился к этому, убедившись, что я вызвал beginUpdate и endUpdate, но как это сделать, если может быть несколько табличных представлений между мной и таблицей обсуждаемый?

Этот бит не работает:

Summary List -> Recursive Table View -> Item View 
    |           | 
    |           | > (a change here modifies the core 
    |            data database, Summary List is 
    |            still somehow loaded and error) 
    | 
Core Data 

Полная ошибка является классическим «вы сделали это неправильно»:

CoreData: error: Serious application error. An exception was 
caught from the delegate of NSFetchedResultsController during a call 
to -controllerDidChangeContent: 
Invalid update: invalid number of rows in section 1. 
The number of rows contained in an existing section after the update 
(0) must be equal to the number of rows contained in that section 
before the update (1), plus or minus the number of rows inserted or 
deleted from that section (0 inserted, 0 deleted) and plus or minus 
the number of rows moved into or out of that section (0 moved in, 0 moved out). 
+0

Можете ли вы дать полный текст сообщения об ошибке? – jrturton

+0

добавлено сейчас, но это просто нормальный ... – SteveDolphin23

+0

Подробнее вопрос. Номера и количество строк и разделов, а также тип операции помогают диагностировать происходящее. – jrturton

ответ

1

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

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

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

+0

спасибо, я попробую установить делегат на нуль, как вы предлагаете, однако я могу категорически сказать вам, что я не звоню в beginUpdate и endUpdate. Я попытаюсь обновить вопрос, чтобы дать больше разъяснений. – SteveDolphin23

+0

Если вы используете выбранный контроллер результатов, вы действительно должны использовать начальные и конечные обновления. Что вы делаете в своих методах делегатов FRC? – jrturton

+0

но когда я должен? когда контроллер начального представления исчезнет? – SteveDolphin23

0

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

+0

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

+0

Обращайтесь с ним в 'viewWillAppear'. Просто перезагрузите, прежде чем будет показано представление. – Mundi

+0

Итак, немного странная вещь - если я использую как начало, так и конец в viewDidDissapear/willAppear, тогда он ломается, если я просто использую конец, то он работает: -/ – SteveDolphin23

Смежные вопросы