2010-06-30 5 views
2

У меня есть несколько NSComboBoxes, созданных в Interface Builder, и один из них создан программно.Как установить значение NSComboBox на KVC?

NSComboBoxes, созданные в Interface Builder, идеальны. У меня есть значение, связанное с контроллером стандартных пользователей, и когда их представление открыто, они сидят там с правильным значением. Важно отметить, что это значение отображается как «нормальный» текст в NSComboBox. Другими словами, значение не отображается. Это то, чего я хочу.

Для NSComboBox, который создается программно, я устанавливаю значение с помощью selectItemAtIndex: 0. Когда я делаю это, выбирается правильный элемент - но отображается текст . Я., он подсвечен и все. Я не хочу этого. Ниже приведены обходные пути, которые я предпринял:

(i) Получите редактор полей и установите точку вставки в конец текста. Это не работает, хотя, как ни странно, строка редактора поля ничто или пусто при выполнении этого. Я не уверен, что это правильное поведение для редактора полей.

(II) Попытка различных других способов установки значения комбинированного блока, такие, как setObjectValue, takeStringValueFrom и т.д.

(III) Наконец, и наиболее удручающе, я попытался установить значение NSComboBox с помощью [ myComboBox setValue: @ "Пункт по умолчанию" forKey: @ "value"]; Это не работает с objc_exception_throw, предположительно потому, что нет такого ключа KVC. Но я знаю, что значение поля со списком может быть установлено KVO, потому что оно работает в построителе интерфейса! Я предполагаю, что я не знаю правильного пути. Я попытался перечислить все свойства, используя интроспекцию, но я не могу заставить код работать правильно (objc_property_t не находится в ожидаемых заголовках).

Итак, у меня есть два вопроса:

во-первых, кто-нибудь знает, как установить значение по умолчанию для NSComboBox программно, так что текст в поле не выбрано? Я подойду для этого, включая новый подкласс NSComboBoxCell, если это произойдет.

Во-вторых, может кто-нибудь сказать мне, какой ключ или ключевой путь использует IB, чтобы установить значение NSComboBox? Или, альтернативно, почему мои усилия сделать это не удались?

Я работаю над этим уже много часов, и я действительно схожу с ума!


СПАСИБО, mustISignUp! Настолько приятно, что это исправлено. Немного о последующих действиях:

(i) Выбор текста определенно вызван фокусом. Вызов setRefusesFirstResponder: ДА исправляет проблему. К сожалению, окно действительно хочет сфокусироваться на этом поле со списком, поскольку настройка отказываетFirstResponder обратно в NO (позже, после инициализации окна) снова вызывает выбор текста (я хочу, чтобы пользователь мог сосредоточиться на этом поле, если он этого захочет). Поэтому в моем случае окончательным решением было вызвать [window makeFirstResponder: otherControl]. Как ни странно, хотя [window makeFirstResponder: nil] не работает. Любые идеи почему?

(ii) Спасибо, что указали разницу между связями и свойствами. Я многому научился, изучая этот вопрос. Во-первых, я узнал, что вы можете получить список привязок, вызвав - (NSArray *) protectedBindings, который для NSComboBox возвращается (fontSize, выравнивание, toolTip, fontName, enabled, contentValues, fontFamilyName, font, hidden, fontItalic, textColor, value , контент, редактируемый, fontBold).Во-вторых, мне удалось установить значение, используя [myComboBox bind: @ "значение" toObject: [NSMutableString stringWithString: @ "defaultValue"] withKeyPath: @ "string" options: nil], где NSMutableString имеет категорию на нем, которая превращает " string "в свойство. Наконец, это фактически не устраняет проблему выбора текста. Разница между выбором текста с этим полем со списком и теми, что есть в Interface Builder, должна быть их позицией в окне ... Я предполагаю, что это поле со списком только начинается, чтобы стать initialFirstResponder, в то время как другие не были.

Таким образом, мой единственный оставшийся вопрос может быть, почему [window makeFirstResponder: nil] не работает, чтобы сфокусироваться на поле со списком. Не очень важно, но мне было бы любопытно, есть ли у кого-нибудь идеи.

ответ

2

Во-первых, я думаю, что текст выбран, потому что вызов selectItemAtIndex: сделал comboBox первымResponder. Вы можете использовать setRefusesFirstResponder:YES, или вы можете сделать другой элемент первым ответчиком, чтобы текст не отображался.

Если я правильно понял и вы хотите изменить выбор comboBox, вы делаете это правильно.

Во-вторых, вы сбиваете с толку Bindings и KVC. NSComboBox имеет привязку под названием «значение», а не свойство, называемое «значение». Не имеет смысла пытаться установить его с помощью setValue:forKey:, и Interface Builder определенно не делает этого.

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

+0

СПАСИБО за это! См. Мой последующий ответ выше, как изменение вопроса. – Dennis

+0

У меня нет ответа на самом деле, но если вы не используете FScript, чтобы помочь вам в таких вещах, вы обязательно захотите. Поместите фреймворк FScript в Library/Frameworks, соединитесь с ним. Добавить [[NSApp mainMenu] addItem: [[FScriptMenuItem alloc] init]]; to -applicationDidFinishLaunching. Запустите приложение и проверьте меню меню FScript. В открывшемся меню «браузер для просмотра» теперь вы можете выбрать окно, окно просмотра или комбо и попытаться отправить ему сообщения. Это бесценно для таких вещей. – hooleyhoop

+0

Выглядит потрясающе. Спасибо за этот указатель. – Dennis