【问题标题】:How do I make a Menu Bar (NSPopover) App active when clicking on the menu button?单击菜单按钮时,如何使菜单栏(NSPopover)应用程序处于活动状态?
【发布时间】:2016-10-17 06:41:19
【问题描述】:

我有一个位于菜单栏中的应用程序,当您单击该按钮时,它会显示一个 NSPopover。

一切正常,但我希望 NSSearchField 成为第一响应者,这样用户就可以直接在框中键入。

但是,如果尚未选择该应用,它将无法运行。尽管搜索框看起来是活动的,但键盘输入会转到上一个打开的应用程序,因为从技术上讲,它仍然是活动窗口。

我已经看到一些关于此类事情的问题,但它们都需要像 makekeyandorder 这样的 objc 方法,或者只是不适用于 NSPopover 的东西。

所以我的问题是 - 有没有办法在按下按钮时强制应用程序成为活动应用程序?

我有一个疯狂的猜测并尝试了NSApplication().sharedApplication().becomeFirstResponder(),但没有运气。

如果还有其他方法可以做到这一点,我完全错过了,那么请告诉我!

【问题讨论】:

  • 您好,可以添加截图吗?
  • 更好的是,这里有一个视频 - f.cl.ly/items/3L152r3F442G2L1P0y3w/Qwiki%20Bug.mov 正如你所看到的,当我第一次单击菜单按钮时,该应用程序之前没有处于活动状态,因此该字段不会成为第一响应者。但是当我点击弹出框后,当我关闭并打开它时,搜索字段可以成为第一响应者。
  • 我知道这是个愚蠢的问题。
  • @ChristopherHannah 根本不是一个愚蠢的问题。

标签: swift macos nsmenuitem nspopover


【解决方案1】:

尽管@Christopher_Hannah 的回答有效,但文档清楚地说,

您无需发送此消息即可创建应用程序的 NSWindows 密钥之一。当您向 NSWindow 对象发送 makeKey() 消息时,您确保它是应用程序处于活动状态时的关键窗口。

所以假设我们在一个视图控制器中,你需要做的就是

override func viewDidAppear() {
    super.viewDidAppear()

    view.window?.makeKey()
}

【讨论】:

    【解决方案2】:

    最后我自己修复了,结果果然是一个非常简单的修复。

    我只需要在 ViewControllers viewDidAppear() 方法中调用 NSApplication.sharedApplication().activateIgnoringOtherApps(true)

    它修复了一切

    【讨论】:

    • 有趣的是,当我构建并尝试使用 xcode 8 时,它无法工作。当其他应用程序有焦点时,它似乎很好。去图...
    • 谢谢!效果很好。在 Swift 4 中,语法略有变化:NSApplication.shared.activate(ignoringOtherApps: true)
    • 我想知道 Dropbox 应用程序如何做类似的事情但没有激活应用程序。当我将鼠标移到 Popover 中的 Dropbox 图标上时,会显示工具提示。但是,在我自己的应用程序中,没有激活它不会弹出工具提示:(
    • @PavelLobodinský 您是否为您描述的事情找到了解决方案?我正在寻找相同的行为。
    • @MartinMihaylov 不,我没有 :( 相反,我以一种无需任何工具提示即可理解的方式设计了我的应用程序图标。但我的猜测是他们使用了定制的窗口。跨度>
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多