Любой пример пользовательского NSComboBox?

Меня просят реализовать поле со списком следующим образом:

введите здесь описание изображения

Понятно, что это довольно отличается от NSComboBox:
‹1> Кнопка рядом с текстовым полем должна быть настроена
‹2> Это гораздо важнее: есть дополнительный «крестик» (который представляет собой кнопку, обозначающую действие «удалить») в каждом элементе комбинации.

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


person Andrew Chang    schedule 26.01.2014    source источник


Ответы (1)


NSComboBox — это представление, но по причинам, которые я не буду вдаваться в подробности, его интерфейс рисуется соответствующим классом ячеек: NSComboBoxCell. Для пользовательского рисования вам обычно нужно создать подкласс типа ячейки (в данном случае NSComboBoxCell), реализовать весь рисунок, который вы хотите, в своем подклассе пользовательской ячейки, а затем заставить представление использовать вашу ячейку с помощью метода -setCellClass: или -setCell:.

Однако в этом случае NSComboBox наследуется от NSTextField, а NSComboBoxCell наследуется от NSTextFieldCell, так что оба уже реализуют -setBackgroundColor: и -setTextColor:; поэтому должно быть довольно легко нарисовать белый фон и синий текст.

Я не уверен, как NSComboBox рисует «выпадающее меню», я не вижу никакого способа его настройки, но я уверен, что это возможно. Вам, вероятно, придется поиграться с методами рисования NSCell, чтобы увидеть,

Последняя проблема, с которой вы столкнетесь, — поставить крестик внутри текстового поля. Вам нужно будет реализовать рисование креста, используя описанные выше методы рисования NSCell. Однако для перехвата щелчков мыши вам нужно будет сделать это с помощью NSView (поскольку NSCell не имеет дело с взаимодействиями). Это означает, что вам также необходимо создать подкласс NSComboBox и отслеживать, когда мышь входит в ту часть представления, где нарисован крест.

Это все довольно сложно, поэтому, возможно, есть другой способ. Вы знаете о NSPopover?

NSPopover

Было бы намного проще реализовать что-то подобное с помощью NSPopover. Всплывающее окно содержит представление, поэтому вам не нужно возиться с методами NSCell. Всплывающее окно может содержать список имен и NSButton (крест).

person Daniel Farrell    schedule 26.01.2014
comment
Вау, NSPopover! Я использовал его раньше. Но у всплывающего окна есть крошечный треугольник, который я не хочу иметь при моделировании раскрывающегося меню. Могу ли я удалить его? - person Andrew Chang; 27.01.2014
comment
Нет, я так не думаю. Вы можете изменить стиль окна на HUD, но он все еще имеет указатель. Создание подкласса поля со списком кажется вашим единственным вариантом. - person Daniel Farrell; 27.01.2014
comment
Как насчет NSMenu? Я ищу, могу ли я настроить внешний вид всего NSMenuItem и добавить поддержку прокрутки - person Andrew Chang; 27.01.2014
comment
Да, кнопки могут запускать меню, stackoverflow.com/questions/9716385 / и меню теперь могут содержать представления, так что да, в принципе, вы можете изучить это. - person Daniel Farrell; 27.01.2014
comment
Но может ли меню поддерживать прокрутку? - person Andrew Chang; 27.01.2014
comment
Да, вы должны получить прокрутку списка бесплатно, если используете NSMenu. - person Daniel Farrell; 27.01.2014