Реализация NSOutlineView/NSTableView с различными ячейками (и типы данных) на строку

Я задаюсь вопросом, как можно было бы реализовать представление схемы как один Xcode 3, использует для конфигурации сборки:

alt text

При использовании NSOutlineView/NSTableView с привязкой и NSTreeController/NSArrayController, столбцы представления присвоили привязку, не отдельные ячейки, по очевидным причинам. Если каждая строка в столбце использует ту же ячейку, то это - кусок пирога. Однако, если каждая строка (потенциально) использует свой собственный тип ячейки (и с тем потенциально ее очень собственным набором привязки), то вещи становятся броскими.

Рассмотрение снимка экрана, можно ясно видеть, что ячейка текстового поля нуждается просто в единственной привязке для "значения". В то время как ячейка кнопки всплывающего меню нуждается по крайней мере в одном для "содержания", один для "contentValues" и наконец, что не менее важно, одной привязки для "selectedIndex / selectedObject / selectedValue". И ячейка флажка нуждается в привязке для "значения" и (вероятно) один для "заголовка".

Как можно было бы выполнить это с максимально чистым (и мало) код?
(Или поскольку можно было бы спросить: Как Apple сделала бы это?)

Вот то, что я судил меня до сих пор:
Я обеспечиваю соответствующие (скопированные) ячейки через [outlineView:dataCellForTableColumn:item:] и связывают их с отдельными моделями данных (от [объект representedObject]). Я знаю точный объем данных (<500 строк) отображаемый в представлении схемы, также - одна ячейка на строку не должна быть слишком большим количеством проблемы памяти, нет? Я заставил данные быть отображенными правильно через привязку (yay!) однако я не могу изменить любое из их значений.O_o По-видимому, изменение значения просто никогда не добирается до модели данных. Существует ли больше к нему, чем простое [toObject:rowModel withKeyPath:@ "значения" checkboxCell bind:@ "значение" options:nil]? (поскольку это кажется достаточным для получения значений, но не для установки их соответственно.)

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

7
задан Glorfindel 4 August 2019 в 15:04
поделиться

1 ответ

Ячейка данных столбца не копируется. Ячейка настраивается на нужное значение для столбца в каждой строке и рисуется в нужном месте. Хорошим местом для подключения является метод NSTableColumn -dataCellForRow:. В пользовательском подклассе вы можете переопределить этот метод и передать либо его -dataCell для нормальной работы, либо какой-нибудь альтернативный тип ячеек.

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

Я создал пользовательский подкласс NSTableColumn, который принимал делегат (контроллер моего источника данных) и проверял, реагирует ли он на селектор -deadCellColumn:shouldShowDeadCellForRow:. Если да, то я вызывал этот метод (который был реализован на моем контроллере источника данных), чтобы спросить его, должен ли я показать "мертвую ячейку" (базовый подкласс NSCell, который ничего не рисует), и менял их местами в зависимости от ответа. Если делегат не отвечал на селектор, столбец таблицы возвращал свое обычное -dataCell.

Пользовательская ячейка (которую я назвал "DeadCell") была нужна здесь, потому что я хотел, чтобы ничего не рисовалось и ничего нельзя было редактировать. Я не уверен, что это было строго необходимо, но я все равно сделал это. Это не очень полезно в вашем случае, но я все равно хотел указать это для полноты картины.

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

3
ответ дан 7 December 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: