Как получить эффект ввода текста в стиле Spotlight в строке меню?

Я хочу иметь значок в строке меню в моем приложении для Mac, и значок должен вызывать меню при нажатии. Имея больше записей в меню, я хотел бы иметь верхнюю строку в качестве универсального поля ввода текста, как в Spotlight:

http://dl.dropbox.com/u/3943878/_mine/Screen%20shot%202011-07-16%20at%2012.29.18.png

Можно ли добавить такое поле в NSMenu? Или я должен сделать это как окно панельного типа?


person kender    schedule 16.07.2011    source источник


Ответы (3)


Если вы используете xcode 4 , создайте собственное представление в конструкторе интерфейсов и добавьте к нему текстовое поле или все, что хотите. В IB также перетащите «Меню» из библиотеки объектов с любым количеством элементов в нем. Затем просто нажмите клавишу Ctrl + щелкните элемент меню, который вы хотите сделать в текстовом поле (в вашем случае это будет верхний), и перетащите его в пользовательское представление и выберите «просмотр». Теперь, когда вы открываете меню, вместо того, чтобы показывать пункт меню в этом пространстве, оно показывает все, что было в вашем пользовательском представлении.

РЕДАКТИРОВАТЬ: Что касается вашего комментария, вот что вы должны сделать. Сделайте свое меню выходом, открыв представление редактора помощника и щелкнув, удерживая клавишу Ctrl, из меню на файл заголовка, который вы хотите использовать. теперь просто создайте метод, который будет запускаться всякий раз, когда будет открываться меню, удобно, что Apple уже сделала это, он называется menuWillOpen.

- (void)menuWillOpen: nameOfYourMenu{

[self performSelector:@selector(methodExecutedWhenMenuIsClicked) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

задержка в 0 заставит это произойти немедленно, это должно быть сделано в цикле выполнения общих режимов, чтобы меню обновлялось, даже когда оно открыто. Теперь просто сделайте methodExecutedWhenMenuIsClicked и установите его так, чтобы текстовое поле реагировало.

- (void)methodExecutedWhenMenuIsClicked{

[[yourTextfiled window] makeFirstResponder:yourTextField];
person Elbimio    schedule 17.07.2011
comment
Спасибо. Любая подсказка, однако, как я могу заставить курсор появляться в поле ввода текста, когда отображается меню? Я хотел бы дать ему начальный фокус, и вызов [textField selectText: nil], похоже, не работает... Вероятно, мне следует сделать его первым ответчиком для какого-то окна... но для какого окна? :) - person kender; 17.07.2011
comment
Я отредактировал свой ответ, дайте мне знать, если это ответит на ваш вопрос. - person Elbimio; 17.07.2011
comment
Хм. Спасибо, это, кажется, помогло :) Иногда я получаю это текстовое поле нередактируемым (и даже щелчок по нему не заставляет курсор появляться там, и я не могу печатать там), но это шаг вперед :) - person kender; 17.07.2011

Вы можете поместить любое представление в меню, используя -[NSMenuItem setView:]. См. длинный комментарий в NSMenuItem.h и раздел Представления в меню в разделе Темы по программированию меню приложений и всплывающих списков.

person Jens Ayton    schedule 16.07.2011

Вероятно, вам придется немного потрудиться. Я только что попытался сделать то же самое и, прочитав документ Представления в меню в документе Меню приложений и темы программирования всплывающих списков, на который ссылается Аруман, я нашел это:

Представление в пункте меню может получать все события мыши как обычно, но события клавиатуры не поддерживаются. Во время «нелипкого» отслеживания меню (то есть манипулирования меню с нажатой кнопкой мыши) представление в пункте меню получает события mouseDragged:.

Я думаю, что мы SOL. Очевидно, вместо этого Spotlight выводит окно без полей.

person Tony Arkles    schedule 21.09.2011