Контекстное меню с результатом поиска для NSSearchField

Я хотел бы иметь контекстное меню, которое показывает результаты поиска, так как текст вводится в поле поиска. Это изображение почтового приложения по умолчанию в OS X, которое делает это. Я знаю, как фильтровать массив строк в соответствии с поисковым запросом пользователя, но я не знаю, как отобразить его таким образом. Я использую Swift и для приложения Какао. Любая помощь приветствуется.

3 ответа

Основываясь на предыдущем ответе, вот простой класс 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
    }
}

NSSearchField searchMenuTemplate (NSMenu) содержит элементы меню (NSMenuItem) со специальными тегами, используемыми полем поиска для заполнения меню.

recentSearches Массив здесь просто для прохождения дополнительного String используется в дополнение к строкам поиска недавних и не требуется (я думал, что он должен был хранить недавний поиск, но нет). NSSearchField также очищает этот массив, когда пользователь очищает поиск последних.

Вы также можете настроить меню с категорией, более подробную информацию здесь: Настройка меню поиска - 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
}

Вам необходимо создать элемент NSMenu со специальными тегами, которые будут заполнителями, чтобы поле поиска знало, куда помещать последние элементы, действия по очистке и т. Д.

Посмотрите документацию для searchMenuTemplate, теги: NSSearchFieldRecentsMenuItemTag и т. Д.

В основном, создайте контекстное меню в IB. Перетащите поле поиска, чтобы использовать это меню в качестве searchMenuTemplate, а затем заполните пункты меню тегами, которые вы хотите удалить, недавние элементы и т. Д.

Другие вопросы по тегам