无法将UISearchController的搜索栏添加到导航栏中,并且未调用委托方法

时间:2019-04-04 04:54:31

标签: ios swift uisearchbar uisearchcontroller uinavigationitem

我想实现一些非常简单的操作:导航栏中的搜索栏,带有一个“取消”按钮,显示该栏何时被激活。

我正在使用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来响应所有方法,但是没有调用UISearchControllerDelegateUISearchBarDelegateself协议中的方法。

如果将以下行放入viewDidLoad中,则委托方法开始起作用:

self.navigationItem.searchController = searchController

但是,我不能将搜索栏放在导航栏中。而是显示在导航栏下方。

我已经在SO中进行了广泛搜索,但似乎没有任何工作对我有用。我可能在这里遗漏了一些明显的东西-如何使其工作?谢谢!

2 个答案:

答案 0 :(得分:1)

只需将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")
        }
    }

希望它对您有用。

答案 1 :(得分:0)

我已经尝试过这段代码,并且一切正常工作

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")
}

用户界面:

enter image description here