2017-10-20 127 views
4

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

应该看起来非常相似的1Password:

1password

这是我能够做到的:

mine

我已经通过创建有三个项目的Status menu并完成了这个为菜单中的第一项创建自定义视图。

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

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

回答

2

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

但是你必须明确地捕捉编辑关键事件。子类NSTextField并重写performKeyEquivalent

class AXCVTextField: NSTextField { 

    override func performKeyEquivalent(with event: NSEvent) -> Bool { 
     if event.modifierFlags.contains(.command) { 
      if 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 action != nil { 
        return NSApp.sendAction(Selector(action!), to:self.window!.firstResponder, from:self) 
       } 
      } 
     } 
     return super.performKeyEquivalent(with: event) 
    } 
} 
+0

我创建了一个子类'类SearchField:的NSTextField {...}'并将它设置为'NSTextField'的类。但是,当我按下'cmd + A'时,该方法不会被触发。另外,我刚刚意识到,有时当我运行应用程序时,我无法点击输入。它变得没有反应,但其他的'NSMenuItem's正常工作。 –

+0

当然,您必须设计自己的观点,即文本字段位于响应者链中以接收关键事件。 – vadian

+0

小心解释一下更多细节?我无法搜索到它 –