Создание панели поиска уведомляет viewController, что пользователь собирается искать - PullRequest
0 голосов
/ 25 сентября 2018

Я использую функцию поиска в моем приложении.Приложение состоит из контроллера представления и пользовательского класса, который обрабатывает логику поиска.Этот пользовательский класс называется SearchController.

Моя цель - заставить searchBar уведомлять контроллер представления, когда пользователь собирается начать поиск (точно такое же поведение, как у UISearchBarDelegate метода searchBarShouldBeginEditing).

Обычно вы просто объявляете searchBarShouldBeginEditing внутри SearchController, но я пытаюсь вызвать этот метод из viewController, потому что я хочу, чтобы что-то изменилось в моем представлении, когда происходит это событие (и, следовательно,его должен обрабатывать viewController, а не searchController)эти два класса, потому что функция поиска уже работает.Единственное, с чем я борюсь - это найти способ сообщить viewController, когда пользователь собирается начать печатать в поле поиска.

Я пытался заставить viewController реализовать UISearchBarDelegate, но я ужезаставляя SearchController реализовать UISearchBarDelegate, так почему я не могу получить доступ к методам делегата внутри viewController?

Надеюсь, я дал понять, что могу уточнить этот пост, если потребуется.Я рвал на себе волосы, пытаясь понять это самостоятельно.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете использовать UISearchController, как предложил rmaddy, реализовать UISearchResultsUpdating

ViewController class:

 class ViewController: UIViewController, UISearchResultsUpdating {
    private let searchController = UISearchController(searchResultsController:  nil) 

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.searchResultsUpdater = self
        searchController.delegate = self

        ....
    }

    // Called when the search bar's text or scope has changed or when the search bar becomes first responder.
    func updateSearchResults(for searchController: UISearchController) {
        //Do something...
    }
}

Или, если вы действительно хотите реализовать поискБарная логика самостоятельно, вы можете пойти с замыканием:

SearchController класс:

class SearchController: NSObject, UISearchBarDelegate {

    let searchBar = UISearchBar()
    var searchButton = UIBarButtonItem? = nil
    var didBeginSearching: (() -> ())?

    /* Other irrelevant class properties */

    func setup() {
        searchBar.delegate = self
        /* other setup */
    }

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        didBeginSearching?()
    }
}

ViewController класс:

class ViewController: UIViewController {

    private let searchController = SearchController() 

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.setup()
        searchController.didBeginSearching = { [weak self] in
            //Do something...
        }
    }
}
0 голосов
/ 25 сентября 2018

Хорошо, searchBar не может иметь 2 делегата, поэтому вам нужно найти способ обойти это.

Один из способов это сделать:

protocol SearchControllerDelegate: class{
    func searchBarDidBeginEditing()
}

class SearchController: NSObject, UISearchBarDelegate {

    weak var delegate: SearchControllerDelegate?

    private let searchBar = UISearchBar()

    func setup() {
        searchBar.delegate = self
    }

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        delegate?.searchBarDidBeginEditing()
    }

}

class ViewController: UIViewController, SearchControllerDelegate{

    var searchController = SearchController()
    func setUP(){
        self.searchController.delegate = self
    }

    func searchBarDidBeginEditing() {
        /// perform some action here
    }

}
...