2013-03-04 3 views
1

В моем приложении я показываю лист с NSComboBox в нем. Если пользователь использует клавиши со стрелками, чтобы выбрать запись из меню, а затем «Вернуть», чтобы выбрать ее, кнопка OK листа также будет действовать, так как она возвращает в качестве эквивалента ключа. Я хотел бы остановить эти клавиши возврата, действуя как ОК. После того, как вы попробовали много вещей (помимо подкласса NSComboBox, который начал превращаться в кошмар), я пытаюсь игнорировать OK щелчки, если поле со списком является первым ответчиком, а текущее событие - клавишей возврата, но NSPanel, который лист подклассов всегда возвращается в качестве текущего первого ответчика. Я ожидал редактор поля, но все, что я получаю, это NSPanel.
1) Есть ли лучший способ сделать это? Пользователь ДЕЙСТВИТЕЛЬНО хочет вводить данные на основе клавиатуры, а не обманывать.
2) Если это лучший способ, как я могу сказать, что поле со списком является первым ответчиком?
Любая помощь с благодарностью принимается. Наверняка об этом уже говорилось?
Rev. ЭндиNSComboBox - ключ возврата ловушки

+0

Вы попробовали создать combobox firstresponder? –

+0

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

+1

Ужасное обходное решение - записать время, в которое было отклонено меню (в comboBoxWillDismiss :), и проверить время, когда вызывается селектор кнопок OK - если между ними меньше 0,1 с, я игнорирую OK. Кнопка OK все еще мигает, но, по крайней мере, работает общая функциональность. Некрасиво. –

ответ

1

Существует обходной путь, его не очень, но это будет работать:

Регистрация для обоих уведомлений NSComboBoxWillPopUpNotification и NSComboBoxWillDismissNotification.

- (void)comboBoxWillPopUp:(NSNotification *)notification 
{ 
    okButton.keyEquivalent = @""; 
} 

- (void)comboBoxWillDismiss:(NSNotification *)notification 
{ 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ 
     okButton.keyEquivalent = @"\r"; 
    }); 
}