Контекстное меню с результатом поиска для 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, а затем заполните пункты меню тегами, которые вы хотите удалить, недавние элементы и т. Д.