Секционированный NSTableView с использованием NSArrayController - PullRequest
9 голосов
/ 26 марта 2011

Я пытаюсь создать секционированный NSTableView, используя NSArrayController и привязки какао.Я ищу подобный подход, как с NSFetchedResultsController в iOS, где вы можете установить путь к ключу раздела.Я хочу сделать что-то похожее с NSArrayController.

. Я приведу пример: у меня разные задачи.Каждое задание имеет один из трех различных приоритетов: низкий, средний или высокий.Задачи также имеют такие атрибуты, как заголовок, описание, дата и т. Д. Я хочу разделить или сгруппировать задачи по приоритету (путь ключа раздела здесь является приоритетом).

Вы можете решить эту проблему с привязками и NSArrayController?Нужно ли мне несколько NSArrayController или только один?

Ответы [ 3 ]

7 голосов
/ 13 марта 2012

Хотя NSTableView может отображать строки группы, к сожалению, от сглаживания иерархии зависит делегат или источник данных.Он не понимает альтернативную семантику источника данных, такую ​​как UITableView UITableViewStyleGrouped, и NSArrayController не имеет эквивалентов для методов секций NSFetchedResultsController.

Одна опция - NSOutlineView, которая предназначенадля отображения сколь угодно глубоких иерархических данных, но это, вероятно, создает больше работы, чем необходимо для простой двухуровневой структуры.(Вы можете привязать схематическое представление к NSTreeController, но контроллер дерева плохо документирован, а для загрузки он плохо спроектирован.)

Итак, вот что я предлагаю:

  • Напишите свой собственный класс контроллера, который реализует NSTableViewDelegate и NSTableViewDataSource.
  • . Используйте один контроллер массива, который сортирует по приоритету, и напишите свой собственный код, чтобы сместить индексы строк для размещения заголовков разделов.
  • Возврат YES из tableView:isGroupRow: в заголовках разделов.
  • Не используйте привязки для этого.

Вы также можете искать многоразовые привязки-способный контроллер от третьего лица.

0 голосов
/ 16 октября 2017

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

  1. Строковое значение для заголовка группы. Ноль, если в строке нет заголовка группы.
  2. Логическое значение isGroupHeader. Необходим для простой tableView:isGroupRow: реализации.
  3. Значение NSManagedObject для ваших обычных данных. Ноль, если строка является заголовком группы.

Благодаря этому у вас есть все инструменты для реализации всех делегатов NSTableView, чтобы получить правильно сгруппированное табличное представление.

0 голосов
/ 07 сентября 2012

Вы можете попробовать реализовать секционированный NSTableView, используя инструменты, упомянутые в этом ответе:

https://stackoverflow.com/a/5369550/893113

...