Реализация NSOutlineView / NSTableView с различными ячейками (и типами данных) на строку - PullRequest
7 голосов
/ 01 августа 2010

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

альтернативный текст http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

При использовании NSOutlineView / NSTableView спривязки и NSTreeController / NSArrayController, столбцы представления получают привязки, присвоенные , а не отдельным ячейкам, по очевидным причинам.Если каждая строка в столбце использует одну и ту же ячейку, то это кусок пирога.Однако, если каждая строка (потенциально) использует свой собственный тип ячейки (и с этим, потенциально, своим собственным набором привязок), то все становится просто прикольным.что ячейке текстового поля нужна только одна привязка для «значения».В то время как ячейке всплывающей кнопки требуется по крайней мере одна ячейка для " content ", одна для " contentValues ​​" и последняя, ​​но не менее важная привязка для " selectedIndex / selectedObject / selectedValue".И ячейка флажка нуждается в привязке для " value " и (вероятно) в привязке для " title ".

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

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

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

1 Ответ

3 голосов
/ 01 августа 2010

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

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

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

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

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

...