NSComboBox в NSToolbar через IB вызывает исключение

#objective-c #cocoa #interface-builder #toolbar #nscombobox

#objective-c #какао #конструктор интерфейса #панель инструментов #nscombobox

Вопрос:

Я хочу NSComboBox в NSToolbar. Я делаю это через IB и Xcode 4.2. Я могу поместить ComboBox на панель инструментов и запустить программу. При первом — и только при первом — запуске приложения я получаю следующее исключение, когда устанавливаю фокус в поле со списком:

Разблокировка фокусировки на неправильном представлении ((null)), ожидаемый NSComboBox

В следующий раз, когда я устанавливаю фокус в поле со списком, исключение не возникает.

Если я сделаю то же самое с NSTextField или searchField, я не получу никакого исключения. Поскольку я не помню, чтобы у меня были такие проблемы в более ранней версии Xcode / Objective-C, мне интересно, является ли это ошибкой.

Ответ №1:

У меня такая же проблема. Установка тестового поля, недоступного для редактирования, не была для меня вариантом, и я не мог заставить работать трюк с полем внутри представления.

Поскольку проблема, похоже, связана с «фокусом», я зашел в конструктор интерфейсов и установил кольцо фокусировки на «Нет» для NSComboBox. Это устранило проблему для меня.

Программно это можно сделать с помощью -setFocusRingType:NSFocusRingTypeNone .

Ответ №2:

Вы уже пробовали следующий обходной путь?

Перед удалением NSComboBox на панели инструментов попробуйте удалить пустой NSView на панели инструментов. Это должно создать для вас элемент панели инструментов с пустым представлением. Затем поместите NSComboBox внутри NSView внутри элемента панели инструментов, который вы только что создали.

У меня были похожие проблемы, и это сработало для меня.

Ответ №3:

У меня была та же проблема. Изменение поведения поля со списком, чтобы его можно было выбирать только, исправляет это.

К счастью для меня, мне не нужно, чтобы поле со списком было доступно для редактирования.

Ответ №4:

Та же проблема с NSComboBox внутри NSPanel. Я изменил кольцо фокусировки с «по умолчанию» на «нет» в IB. Это решило проблему.

Вот еще немного предыстории. Мой код работал нормально, пока не было внесено несколько изменений: проблема возникла после преобразования из Xcode 4.2 (Snow Leopard) в 4.3 (Lion). Также этот переход включал переход от GC к ARC.