NSTextfield + NSMenu и первый ответчик - PullRequest
4 голосов
/ 20 мая 2011

Я пытаюсь реализовать свою собственную систему автозаполнения (результат - извлечение из базы данных sqlite)

Я настроил NSTextField и соответствующий делегат.Каждый раз, когда текст в NSTextField изменяется, он вызывает - (void)controlTextDidChange:(NSNotification *)aNotification метод

Он работает нормально, в этом методе я создаю меню программно и, наконец, я вызываю / показываю его с таким кодом:

 NSRect frame = [address frame];
NSPoint menuOrigin = [[address superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height-25)
                                                toView:nil];

NSEvent *event =  [NSEvent mouseEventWithType:NSLeftMouseDown
                                     location:menuOrigin
                                modifierFlags:NSLeftMouseDownMask // 0x100
                                    timestamp:0
                                 windowNumber:[[address window] windowNumber]
                                      context:[[address window] graphicsContext]
                                  eventNumber:0
                                   clickCount:1
                                     pressure:1]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:address];

Где address - мой NSTextField, а menu - мой NSMenu.Проблема в том, что меню фокусируется, поэтому вы можете ввести только 1 букву в текстовом поле, а затем больше не можете вводить текст, потому что меню теперь является первым респондентом.

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

Это должно быть, например, в адресной строке Safari или Chrome.

Ответы [ 2 ]

4 голосов
/ 21 мая 2011

Я не верю, что это возможно с NSMenu. Реализация NSMenu контролируется системой на довольно низком уровне и предназначена для фокусировки на клавиатуре. Вам нужно создать собственное представление или окно, которое выглядит как меню, но не использует NSMenu. Например, обратите внимание, что меню в адресной строке Chrome не похоже на стандартное NSMenu. Вам необходимо создать представление, которое будет появляться и рисовать, и получать обратные вызовы или уведомления для обновления по мере ввода пользователем текста, но не будет фокусироваться на клавиатуре. В NSView есть методы (фактически NSResponder), которые контролируют, принимает ли представление статус первого респондента.

1 голос
/ 23 мая 2011

Как сказал Мгорбах, это не возможно с NSMenu. Я переключился на NSTableView и настроил свое текстовое поле. Текстовое поле направляет стрелки вверх и вниз к представлению таблицы, и это отлично работает!

...