Как использовать элемент поиска на панели инструментов?

#swift #xcode #macos

#swift #xcode #macos

Вопрос:

У меня есть приложение для macOS, использующее Xcode 11 для разработки, и у меня есть слабая переменная @IBOutlet searchTextField: NSSearchField! в моем классе view controller для фильтрации табличного представления. Кроме того, у меня есть опции меню для этого поля поиска. Этот код работает нормально. Тем не менее, я хотел бы перенести эту функцию поиска на панель инструментов. Итак, я добавил элемент панели инструментов поиска на панель инструментов и перетащил его с помощью CTRL первому ответчику и подключил его к функции @IBAction. Но я не знаю, как поступить. Какие шаги необходимо выполнить для реализации функции поиска на панели инструментов. Пожалуйста, посоветуйте.

Комментарии:

1. Связано ли действие поля поиска в контроллере представления с действием этого контроллера представления? К какому действию подключено поле поиска на панели инструментов?

2. Поле поиска, которое находится в коде контроллера представления: IBOutlet weak var searchTextField: NSSearchField!». Весь рабочий код использует это поле. Действие для действия поля поиска панели инструментов — IBAction func searchCustomer(_ obj: NSSearchField) { print(«Поиск выбран») .. Когда я сказал «первый ответчик», я имел в виду первого ответчика IB.

3. Какой класс реализует searchCustomer ? Используете ли вы выход за пределы NSSearchFieldDelegate и методы действия поля поиска?

4. Является ли контроллер представления контроллером представления содержимого окна?

5. Да, контроллер представления является контроллером представления содержимого для окна, и именно в этом классе у меня есть IBAction searchCustomer.

Ответ №1:

Я получил это от другого пользователя. Это именно то, что я искал.

 //  ViewController.swift
// This assumes the search field is first in the toolbar
import Cocoa

class ViewController: NSViewController {

    override func viewWillAppear() {
        
        guard let toolbar = self.view.window?.toolbar else {
            return
        }
                
        guard let searchFieldToolbarItem = toolbar.items.first else {
            return
        }

        guard let searchField = searchFieldToolbarItem.view as? NSSearchField else {
            return
        }
                
        searchField.target = self
        searchField.action = #selector (procSearchFieldInput (sender:))
    }
    
    @objc func procSearchFieldInput (sender:NSSearchField) {
        print ("(#function): (sender.stringValue)")
    }
}