【问题标题】:Creating 1Password-like macOS menubar app创建 1Password-like macOS 菜单栏应用
【发布时间】:2017-10-20 22:33:07
【问题描述】:

我正在尝试创建一个将文本字段作为第一项的 macOS 菜单栏应用程序。该文本字段将用作搜索栏,用于过滤将在其下方显示的其他项目。

它应该看起来与 1password 非常相似:

这是我设法做到的:

我通过创建一个包含三个项目的Status menu 并为菜单中的第一个项目创建一个自定义视图来实现这一点。

但是,这种方法似乎无法解决我的问题。在搜索字段中按cmd + A 时,焦点会跳转到菜单中的下一项。这是NSMenu 的默认行为。

所以,我的问题是:这是创建类似 1Password 的应用程序的正确方法还是有更好的方法?

【问题讨论】:

    标签: swift xcode macos menubar nsmenu


    【解决方案1】:

    基本上这个方法是正确的。

    但是您必须明确地捕获编辑键事件。子类NSTextField 并覆盖performKeyEquivalent

    class AXCVTextField: NSTextField {
    
        override func performKeyEquivalent(with event: NSEvent) -> Bool {
            if event.modifierFlags.contains(.command),
              let key = event.charactersIgnoringModifiers {
                var action : String?
                switch key {
                case "x": action = "cut:"
                case "c": action = "copy:"
                case "v": action = "paste:"
                case "a": action = "selectAll:"
                default:
                    break
                }
                if let action = action {
                    return NSApp.sendAction(Selector(action), to:self.window!.firstResponder, from:self)
                }
            }
            return super.performKeyEquivalent(with: event)
        }
    }
    

    【讨论】:

    • 我创建了一个子类class SearchField: NSTextField {...},并将其设置为NSTextField的类。但是,当我按cmd + A 时,不会触发该方法。另外,我刚刚意识到有时当我运行应用程序时,我无法点击输入。它变得无响应,但其他 NSMenuItems 工作正常。
    • 当然你必须设计你的视图,文本字段在响应者链中以接收关键事件。
    • 想详细解释一下吗?我在谷歌上搜索时遇到问题
    • 为了能够接收(键)事件,视图必须位于可以成为键窗口的窗口中。我猜 1Password 使用单独的窗口控制器而不是简单的 NSMenu
    • 您是否建议我将NSMenu 替换为一个自定义窗口,该窗口显示在NSMenu 默认执行的位置并在该窗口中实现所有内容?
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2010-09-18
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多