带有NSSearchField搜索结果的上下文菜单

S. *_*ung 2 macos cocoa contextmenu nssearchfield swift

我希望有一个上下文菜单,在搜索字段中输入文本时显示搜索结果.这是OS X中默认邮件应用程序的 图像.我知道如何根据用户的搜索请求过滤字符串数组,但我不知道如何以这种方式显示它.我正在使用Swift和Cocoa应用程序.任何帮助表示赞赏.

Rya*_*oni 6

从前面的答案构建,这是一个简单的Swift 3类,您可以使用它来自动处理最近的搜索.您可以在故事板中将其添加为自定义类,也可以直接添加.它看起来像这样:

在此输入图像描述

import Cocoa

class RecentMenuSearchField: NSSearchField {

    lazy var searchesMenu: NSMenu = {

        let menu = NSMenu(title: "Recents")

        let recentTitleItem = menu.addItem(withTitle: "Recent Searches", action: nil, keyEquivalent: "")
        recentTitleItem.tag = Int(NSSearchFieldRecentsTitleMenuItemTag)

        let placeholder = menu.addItem(withTitle: "Item", action: nil, keyEquivalent: "")
        placeholder.tag = Int(NSSearchFieldRecentsMenuItemTag)

        menu.addItem( NSMenuItem.separator() )

        let clearItem = menu.addItem(withTitle: "Clear Menu", action: nil, keyEquivalent: "")
        clearItem.tag = Int(NSSearchFieldClearRecentsMenuItemTag)

        let emptyItem = menu.addItem(withTitle: "No Recent Searches", action: nil, keyEquivalent: "")
        emptyItem.tag = Int(NSSearchFieldNoRecentsMenuItemTag)

        return menu
    }()

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        initialize()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        initialize()
    }

    //create menu
    private func initialize() {
        self.searchMenuTemplate = searchesMenu
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这如何回答这个问题。菜单显示最近的*搜索*,它不显示要求的搜索*结果*(参见屏幕截图)。我缺少什么? (3认同)

Ati*_*ika 5

NSSearchField searchMenuTemplate(NSMenu) 包含菜单项(NSMenuItem) 以及搜索字段用来填充菜单的特定标记。

\n\n

这里的数组recentSearches只是为了传递额外的String用于补充最近搜索字符串的内容,而不是必需的(我认为它是为了存储最近的搜索,但不是)。当用户清除“最近搜索”时, NSSearchField 也会清除此数组。

\n\n

您还可以配置带有类别的菜单,更多信息请参见:\n配置搜索菜单 \xe2\x80\x94 Apple Developer

\n\n

例子:

\n\n
@IBOutlet weak var search: NSSearchField!\n\n/// Array of string containing additional recents search (custom search)\nvar recentSearches = [String]()\n\n/// Search Field Recents Menu\nlazy var searchesMenu: NSMenu = {\n\n    let menu = NSMenu(title: "Recents")\n\n    let i1 = menu.addItem(withTitle: "Recents Search", action: nil, keyEquivalent: "")\n    i1.tag = Int(NSSearchFieldRecentsTitleMenuItemTag)\n\n    let i2 = menu.addItem(withTitle: "Item", action: nil, keyEquivalent: "")\n    i2.tag = Int(NSSearchFieldRecentsMenuItemTag)\n\n    let i3 = menu.addItem(withTitle: "Clear", action: nil, keyEquivalent: "")\n    i3.tag = Int(NSSearchFieldClearRecentsMenuItemTag)\n\n    let i4 = menu.addItem(withTitle: "No Recent Search", action: nil, keyEquivalent: "")\n    i4.tag = Int(NSSearchFieldNoRecentsMenuItemTag)\n\n    return menu\n}()\n\noverride func viewDidLoad() {\n    super.viewDidLoad()\n    recentSearches = ["Toto","Titi","Tata"]\n    search.delegate = self\n    search.recentSearches = recentSearches\n    search.searchMenuTemplate = searchesMenu\n}\n
Run Code Online (Sandbox Code Playgroud)\n


vad*_*ade 0

您需要创建一个带有占位符的特殊标签的 NSMenu 项目,以便搜索字段知道在哪里放置最近的项目、清除操作等。

查看 searchMenuTemplate 和 Tags 的文档: NSSearchFieldRecentsMenuItemTag 等。

基本上,在 IB 中制作一个上下文菜单。拖动搜索字段以将该菜单用作 searchMenuTemplate,然后使用您想要的清晰、最近项目等标签填充菜单项。