2013-02-25 4 views
10

Как связать контент NSArrayController с объектами в отношениях упорядоченных ко многим?Связывание упорядоченной связи с NSArrayController

У меня есть отношение неупорядоченных ко многим в моей модели Core Data и NSArrayController, набор содержимого которых связан с этим отношением от родительского объекта. Это прекрасно работает, данные доступны из NSArrayController, без проблем.

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

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

Теперь на самом деле, я думаю, что все это имеет смысл: Это упорядоченные отношения, так что теперь я получаю упорядоченный набор. Было бы неуместно привязывать его к Content Array, поскольку теперь это NSOrderedSet, а не массив. Мой вопрос: Теперь как связать данные этой связи с NSArrayController?

+0

Я тоже сталкивался с этой проблемой, и я вполне уверен, что это ошибка с 'NSArrayController' - подала отчет об ошибке. – Vervious

+0

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

ответ

8

Основная проблема заключается в том, что отношения с базовыми данными, привязанные ко многим, возвращают NSOrderedSet, а NSOrderedSet не является подклассом NSSet. Любые привязки контроллера массива, которые ожидают, что NSSet завершится с ошибкой.

Tom Fewster имеет detailed blog post, описывающий использование NSValueTransformer, чтобы обойти этот недостаток, преобразовывая NSOrderedSet и NSArray на лету. Он также предоставляет sample implementation on Github.

+0

Спасибо! Как я отмечаю в последнем параграфе вопроса, я знаю, что наследование NSSet (а не его отсутствие) - это проблема с привязками, которые в настоящее время стоят. Но этот подход трансформатора ценности - спасатель жизни! Я обязательно посмотрю на это. – Khakionion

+3

Проблема с обходным решением (я думаю) заключается в том, что изменчивые аксессоры не будут использоваться, а это означает, что любое изменение означает переназначение/реконвертирование всего набора. – Vervious

9

Я столкнулся с этим обсуждением во время поиска, чтобы увидеть, были ли какие-либо новые разработки на этом фронте. В приложении для доставки я в настоящее время привязываю массив содержимого контроллера массива к [email protected], и он работает отлично, не уверен, что я обнаружил, что сам или кто-то другой предложил его где-то.

+0

Это, безусловно, решение. – Altimac

+2

Я не уверен, что это решение, потому что оператор «массив» вызывает метод «массив» NSOrderSet, который возвращает объект массива «фасад», который неизменен по дизайну - (см. Его заголовочный файл doc в NSOrderSet.h). Это означает, что NSArrayController может «привязываться», но не вносит никаких изменений в NSOrderedSet. Это не более чем двусторонняя привязка. только для чтения. –

+0

совершенно верно. Если вам нужна изменчивость, это провалится. Хороший улов;) – Altimac