Содержимое NSTableView на основе выбора другого NSArrayController - PullRequest
1 голос
/ 24 марта 2011

Проблема

У меня есть всплывающая кнопка (NSPopUpButton), связанная с NSArrayController.Этот контроллер массива обрабатывает родительские объекты, каждый из которых имеет коллекцию дочерних объектов.У меня есть NSTableView, в котором мне нужно показать этих детей для выбранного элемента во всплывающем окне.Кроме того, необходимо управлять списком детей (добавлять / удалять).

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

Данные управляются здесь Core Data и, таким образом, коллекции NSSet s.Я попытался добавить метод преобразования в родительский метод для возврата отсортированного NSArray (чтобы связать его с NSArrayController), но этот подход предотвращает KVO и контроллер массива не обновляется должным образом.

Заранее спасибо.

Пример

Для пояснения приведем гипотетический пример:

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

Ответы [ 2 ]

3 голосов
/ 03 августа 2012

Для этого есть решение без настройки делегата / источника данных.

Мой контекст таков:

  • CoreData модель с родителями и детьми, один из родителей имеет несколько детей через отношения, названные детьми. Оба имеют атрибут name.
  • Две сущности должны быть доступны как классы (каждая с .m и .h). (Xcode напишет их для вас, если вы перейдете в File-New-File-CoreData-NSManagedObjectSubclass.) Теперь к ChildObjects из ParentObject можно получить доступ через ParentObject.children
  • Два NSArrayControllers: ParentArrayController и ChildArrayController.
  • Два NSTableViews: ParentTable и ChildTable, каждый с одним столбцом для name. (Не имеет значения, используете ли вы всплывающее окно или таблицу, если она управляется NSArrayController.)

Шаги должны быть следующими:

  • Подключите оба NSArrayControllers к MangagedObjectContext как обычно и установите для них режим: Entity Name с соответствующим им объектом (родительским или дочерним)
  • Как обычно, привяжите оба TableViews (их столбцы) к своему NSArrayController.
  • Теперь приходит волшебство: в разделе ChildArrayController s привязки в ControllerContent-ContentSet привязка к ParentArrayController с ControllerKey: selection и ModelKeyPath: children.

Готово. Если вы выберете ParentObject в ParentTable, ChildTable покажет своих потомков.

Чтобы добавить и удалить детей к родителям, вы можете использовать метод (void)addChildrenObject:(Child *)value;, который Xcode написал для вас в файле класса Parents.m.

0 голосов
/ 26 марта 2011

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

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

...