У меня есть несколько NSComboBox, созданных в Interface Builder, и один, созданный программно.
NSComboBox, созданные в Interface Builder, идеальны.У меня есть их значение, связанное с контроллером по умолчанию для общего пользователя, и когда их представление открыто, они сидят там с правильным значением.Важно отметить, что это значение отображается как «обычный» текст в NSComboBox.Другими словами, значение не отображается выбранным.Это то, что я хочу.
Для NSComboBox, который создается программно, я устанавливаю значение, используя selectItemAtIndex: 0.Когда я делаю это, выбирается правильный элемент, но появляется текст .Т.е. это подсвечивается и все.Я не хочу этогоВот обходные пути, которые я попытался:
(i) Получить редактор полей и установить точку вставки в конце текста.Это не работает, хотя, как ни странно, строка редактора полей при этом либо равна нулю, либо пуста.Я не уверен, является ли это правильным поведением для редактора полей.
(ii) Попробовать другие способы установки значения поля со списком, такие как setObjectValue, takeStringValueFrom и т. Д.
(iii) Наконец, и самое разочаровывающее, я попытался установить значение NSComboBox, используя [myComboBox setValue: @ "The Default Item" forKey: @ "value"];Это происходит с objc_exception_throw, предположительно потому, что такого ключа KVC нет.Но я знаю, что значение поля со списком может быть установлено KVO, потому что оно работает в конструкторе интерфейсов!Я предполагаю, что я не знаю правильный ключевой путь.Я попытался перечислить все свойства, используя интроспекцию, но я не могу заставить код работать правильно (objc_property_t не находится в ожидаемых заголовках).
Итак, у меня есть два вопроса:
Во-первых, кто-нибудь знает, как программно установить значение по умолчанию для NSComboBox, чтобы текст в поле не выделялся?Я сделаю все возможное, чтобы сделать это, включая новый подкласс NSComboBoxCell, если это произойдет.
Во-вторых, может кто-нибудь сказать мне, какой ключ или путь ключа IB использует для установки значения NSComboBox?Или, альтернативно, почему мои попытки сделать это терпят неудачу?
Я работаю над этим уже много часов, и я действительно воодушевлен!
СПАСИБО, mustISignUp!Так приятно это исправить.Немного продолжения:
(i) Выбор текста определенно вызван фокусом.Вызов setRefusesFirstResponder: ДА устраняет проблему.К сожалению, окно действительно хочет сфокусироваться на этом поле со списком, так как установка refsesFirstResponder обратно на NO (позже, после инициализации окна) снова вызывает выделение текста (я хочу, чтобы пользователь мог сосредоточиться на этом окне, если он этого хочет).Поэтому в моем случае окончательным решением было вызвать [window makeFirstResponder: otherControl].Как ни странно, хотя [window makeFirstResponder: nil] не работает.Есть идеи, почему?
(ii) Спасибо за указание на разницу между привязками и свойствами.Я многому научился, изучая этот вопрос.Во-первых, я узнал, что вы можете получить список привязок, вызвав - (NSArray *) visibleBindings, который для NSComboBox возвращает (fontSize, alignment, toolTip, fontName, enabled, contentValues, fontFamilyName, шрифт, hidden, fontItalic, textColor, value, контент, редактируемый, fontBold).Во-вторых, я смог установить значение, используя [myComboBox bind: @ "value" toObject: [NSMutableString stringWithString: @ "defaultValue"] withKeyPath: @ "string" options: nil], где NSMutableString имеет категорию, которая поворачивается "строка "в собственность.Наконец, это фактически не решает проблему выбора текста.Разница между выделением текста в этом поле со списком и в Интерфейсном Разработчике должна заключаться в их положении в окне ... Я думаю, что это поле со списком просто должно стать initialFirstResponder, в то время как другие не были.
Так что мой единственный оставшийся вопрос может заключаться в том, почему [window makeFirstResponder: nil] не работает, чтобы снять фокус со поля со списком. Не супер важно, но мне было бы любопытно, если у кого-нибудь есть идея.