4

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

4

3 回答 3

5

从上一个答案构建,这是一个简单的 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
    }
}
于 2017-07-25T23:13:42.363 回答
3

NSSearchField searchMenuTemplate(NSMenu) 包含带有特定标签的菜单项(NSMenuItem),搜索字段用于填充菜单。

这里的recentSearchesArray 只是传递String用于补充最近搜索字符串的附加值,不是必需的(我认为它是存储最近的搜索但不是)。NSSearchField 也会在用户清除“Recents Search ”时清除此 Array 。

您还可以配置带有类别的菜单,更多信息在这里: 配置搜索菜单 — Apple Developer

例子:

@IBOutlet weak var search: NSSearchField!

/// Array of string containing additional recents search (custom search)
var recentSearches = [String]()

/// Search Field Recents Menu
lazy var searchesMenu: NSMenu = {

    let menu = NSMenu(title: "Recents")

    let i1 = menu.addItem(withTitle: "Recents Search", action: nil, keyEquivalent: "")
    i1.tag = Int(NSSearchFieldRecentsTitleMenuItemTag)

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

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

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

    return menu
}()

override func viewDidLoad() {
    super.viewDidLoad()
    recentSearches = ["Toto","Titi","Tata"]
    search.delegate = self
    search.recentSearches = recentSearches
    search.searchMenuTemplate = searchesMenu
}
于 2017-06-14T17:50:37.503 回答
0

You need to make an NSMenu Item with special tags that are placeholders so the search field knows where to put recent items, the clear action, etc.

Look at documentation for searchMenuTemplate, and the Tags : NSSearchFieldRecentsMenuItemTag etc.

Basically, make a contextual menu in IB. Drag your search field to use that menu as the searchMenuTemplate, and then populate menu items with the tags you want for clear, recent items, etc.

于 2016-11-26T19:49:44.353 回答