Как сделать приложение строки меню (NSPopover) активным при нажатии на кнопку меню?

У меня есть приложение, которое находится в строке меню, и когда вы нажимаете кнопку, оно представляет NSPopover.

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

Однако, если приложение еще не выбрано, оно не будет работать. И хотя окно поиска выглядит активным, ввод с клавиатуры переходит к предыдущему открытому приложению, потому что технически это все еще активное окно.

Я видел несколько вопросов о подобных вещах, но все они требуют методов objc, таких как makekeyandorder, или просто вещей, которые не будут применяться к NSPopover.

Итак, мой вопрос: есть ли способ, которым при нажатии кнопки я могу заставить приложение стать активным приложением?

У меня была дикая догадка, и я попробовал NSApplication().sharedApplication().becomeFirstResponder(), но безуспешно.

Если есть другой способ сделать это, который я только что полностью пропустил, то, пожалуйста, дайте мне знать!


person Christopher Hannah    schedule 15.06.2016    source источник
comment
Привет, можешь добавить скриншот?   -  person xmhafiz    schedule 16.06.2016
comment
Еще лучше, вот видео - f.cl.ly/items/3L152r3F442G2L1P0y3w/Qwiki %20Bug.mov Как видите, когда я впервые нажимаю кнопку меню, приложение ранее не было активным, поэтому поле не становится первым ответчиком. Но после того, как я нажму на всплывающее окно, когда я закрою и открою его, поле поиска может стать первым ответчиком.   -  person Christopher Hannah    schedule 16.06.2016
comment
Я знал, что это глупый вопрос.   -  person Christopher Hannah    schedule 17.06.2016
comment
@ChristopherHannah совсем не глупый вопрос.   -  person sean woodward    schedule 11.04.2018


Ответы (2)


Я исправил это сам в конце концов, это оказалось очень простым решением, как и ожидалось.

Все, что мне нужно было сделать, это вызвать NSApplication.sharedApplication().activateIgnoringOtherApps(true) в методе ViewControllers viewDidAppear().

Он исправляет все!

person Christopher Hannah    schedule 16.06.2016
comment
что интересно, он не работает, когда я создаю и пытаюсь использовать xcode 8. кажется, что все в порядке, когда другие приложения имеют фокус. иди разберись... - person joe; 22.01.2017
comment
Спасибо! Работает отлично. В Swift 4 синтаксис немного изменился: NSApplication.shared.activate(ignoringOtherApps: true) - person Savjee; 27.11.2017
comment
Интересно, как приложение Dropbox делает то же самое, но без активации приложения. Когда я навожу указатель мыши на значки Dropbox во всплывающем окне, отображаются всплывающие подсказки. Однако в моем собственном приложении без активации всплывающая подсказка не появляется :( - person Pavel Lobodinský; 18.08.2018
comment
@PavelLobodinský Вы нашли решение для того, что описали? Я ищу такое же поведение. - person Martin Mihaylov; 02.06.2019
comment
@MartinMihaylov Нет, я этого не делал :( Вместо этого я разработал значки своего приложения таким образом, чтобы они были понятны без каких-либо всплывающих подсказок. Но я скромно предполагаю, что они используют специальное окно. - person Pavel Lobodinský; 03.06.2019

Несмотря на то, что ответ @Christopher_Hannah работает, в документации четко сказано:

Вам не нужно отправлять это сообщение, чтобы сделать один из ключей NSWindows приложения. Когда вы отправляете сообщение makeKey() объекту NSWindow, вы гарантируете, что это ключевое окно, когда приложение активно.

Итак, если мы находимся в контроллере представления, все, что вам нужно сделать, это

override func viewDidAppear() {
    super.viewDidAppear()

    view.window?.makeKey()
}
person cnotethegr8    schedule 15.03.2020