无法将UISearchController搜索栏添加到导航栏并委托不调用的方法

问题描述 投票:1回答:2

我想要实现一些非常简单的事情:导航栏中的搜索栏,带有一个取消按钮,显示栏被激活的时间。

我使用的是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
}

搜索栏显示。但是,如果我专注于它,则不会显示“取消”按钮,也不会调用任何委托方法。也就是说,UISearchResultsUpdatingUISearchControllerDelegateUISearchBarDelegate协议中没有任何方法被调用,尽管我已经设置了self以响应所有这些方法。

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

self.navigationItem.searchController = searchController

但是,我无法将搜索栏放在导航栏中。它显示在导航栏下面。

我在SO中进行了广泛的搜索,但似乎没有什么对我有用。我可能会在这里遗漏一些明显的东西 - 我怎样才能让它发挥作用?谢谢!

ios swift uisearchbar uisearchcontroller uinavigationitem
2个回答
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")
        }
    }

希望它能为你效劳。


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

© www.soinside.com 2019 - 2024. All rights reserved.