Невозможно добавить панель поиска UISearchController в панель навигации и делегировать методы, не вызываемые - PullRequest
1 голос
/ 04 апреля 2019

Я хочу добиться чего-то очень простого: панель поиска на панели навигации с кнопкой «Отмена», которая показывает, когда панель активирована.

Я использую UISearchController, и в настоящее время у меня есть следующее:

override func viewDidLoad() {
  super.viewDidLoad()
  ...

  let searchController = UISearchController(searchResultsController: nil)
  searchController.searchResultsUpdater = self
  searchController.delegate = self
  searchController.searchBar.delegate = self
  searchController.hidesNavigationBarDuringPresentation = false
  searchController.searchBar.sizeToFit()
  self.navigationItem.titleView = searchController.searchBar
  self.definesPresentationContext = true
}

Строка поиска показывает. Однако, если я сфокусируюсь на этом, кнопка «Отмена» не отображается, и никакие методы делегата не вызываются вообще. То есть методы в протоколах UISearchResultsUpdating, UISearchControllerDelegate или UISearchBarDelegate не вызываются, хотя я установил self для ответа на все из них.

Если я добавлю следующую строку в viewDidLoad, методы делегата начнут функционировать:

self.navigationItem.searchController = searchController

Однако тогда я не могу поместить панель поиска внутри панели навигации. Вместо этого он отображается под панелью навигации.

Я много искал в SO, но, похоже, у меня ничего не работает. Я могу упустить что-то очевидное здесь - как я могу заставить это работать? Спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Просто определите UISearchController как свойство, тогда все работает нормально.

Я тестировал ниже в примере проекта.

  class ViewControllerName: UIViewController{
       let searchController = UISearchController(searchResultsController: nil)

        override func viewDidLoad() {
            super.viewDidLoad()
            let search = UISearchController(searchResultsController: nil)
            self.navigationItem.searchController = search
            self.navigationItem.searchController!.searchBar.delegate = self
            self.navigationItem.searchController!.searchResultsUpdater = self
            self.navigationItem.searchController?.searchBar.showsCancelButton = true
        }

       func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
            print("Called")
        }

        func updateSearchResults(for searchController: UISearchController) {
            print("Called")
        }
    }

Надеюсь, это сработает для вас.

0 голосов
/ 04 апреля 2019

Я попробовал этот код, и все работает prop

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {


@IBOutlet weak var tblView: UITableView!


override func viewDidLoad() {
    super.viewDidLoad()
    :
    :

    let search = UISearchController(searchResultsController: nil)
    self.navigationItem.searchController = search
    self.navigationItem.searchController!.searchBar.delegate = self
    self.navigationItem.searchController!.searchResultsUpdater = self
    self.navigationItem.searchController?.searchBar.showsCancelButton = true

    :
    :
}

Протестировано ниже делегатов, и оба вызваны как ожидалось.

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    print("search end editing.")
}

func updateSearchResults(for searchController: UISearchController) {
    print("update search results ... called here")
}

UI:

enter image description here

...