2017-10-20 126 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

小心解釋一下更多細節?我無法搜索到它 –