UISeachController Делегированные методы не вызваны, панель поиска не может стать первым респондентом - PullRequest
0 голосов
/ 05 февраля 2019

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

Определение searchcontroller:

lazy var searchController: UISearchController = {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search"
    return searchController
}()

Настройкаэто вверх:

private func setupSearchController() {
    self.navigationItem.searchController = searchController
    searchController.definesPresentationContext = true
    searchController.delegate = self
    searchController.isActive = true
    searchController.searchBar.delegate = self
    searchController.searchBar.becomeFirstResponder()
}

Я попробовал это предложение из другого вопроса SO, но метод делегата не вызывается:

func didPresentSearchController(searchController: UISearchController) {
    UIView.animate(withDuration: 0.1, animations: { () -> Void in }) { (completed) -> Void in
        searchController.searchBar.becomeFirstResponder()
    }
}

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема в том, что вы пытаетесь получить доступ к элементу пользовательского интерфейса (searchbarcontroller) до полной загрузки пользовательского интерфейса.Это можно сделать двумя способами:

  1. Использовать основную очередь для отображения клавиатуры

    private func setupSearchController() {
         self.navigationItem.searchController = searchController
         searchController.definesPresentationContext = true
         searchController.delegate = self
         searchController.isActive = true
         searchController.searchBar.delegate = self
         DispatchQueue.main.async {
               self.searchController.searchBar.becomeFirstResponder()
         } 
    }
    

При таком подходе клавиатура будет отображаться только в одномвремя в viewDidLoad

Показать клавиатуру в viewDidAppear

override func viewDidAppear(_ animated: Bool) {
     super.viewDidAppear(animated)
     self.searchController.searchBar.becomeFirstResponder()
}

При таком подходе клавиатура будет всегда отображаться при каждом появлении экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...