NSComboBox — это представление, но по причинам, которые я не буду вдаваться в подробности, его интерфейс рисуется соответствующим классом ячеек: NSComboBoxCell. Для пользовательского рисования вам обычно нужно создать подкласс типа ячейки (в данном случае NSComboBoxCell), реализовать весь рисунок, который вы хотите, в своем подклассе пользовательской ячейки, а затем заставить представление использовать вашу ячейку с помощью метода -setCellClass:
или -setCell:
.
Однако в этом случае NSComboBox наследуется от NSTextField, а NSComboBoxCell наследуется от NSTextFieldCell, так что оба уже реализуют -setBackgroundColor: и -setTextColor:; поэтому должно быть довольно легко нарисовать белый фон и синий текст.
Я не уверен, как NSComboBox рисует «выпадающее меню», я не вижу никакого способа его настройки, но я уверен, что это возможно. Вам, вероятно, придется поиграться с методами рисования NSCell, чтобы увидеть,
Последняя проблема, с которой вы столкнетесь, — поставить крестик внутри текстового поля. Вам нужно будет реализовать рисование креста, используя описанные выше методы рисования NSCell. Однако для перехвата щелчков мыши вам нужно будет сделать это с помощью NSView (поскольку NSCell не имеет дело с взаимодействиями). Это означает, что вам также необходимо создать подкласс NSComboBox и отслеживать, когда мышь входит в ту часть представления, где нарисован крест.
Это все довольно сложно, поэтому, возможно, есть другой способ. Вы знаете о NSPopover?
![NSPopover](https://i.stack.imgur.com/sx6gd.png)
Было бы намного проще реализовать что-то подобное с помощью NSPopover. Всплывающее окно содержит представление, поэтому вам не нужно возиться с методами NSCell. Всплывающее окно может содержать список имен и NSButton (крест).
person
Daniel Farrell
schedule
26.01.2014