无法将 UISearchController 搜索栏添加到导航栏中,委托方法未被调用
Unable to add UISearchController's search bar into navigationbar and delegate methods not getting called
我想实现一些非常简单的事情:导航栏中的搜索栏,带有一个取消按钮,该按钮在该栏被激活时显示。
我正在使用 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 中进行了广泛的搜索,但似乎没有任何内容适合我。我可能在这里遗漏了一些明显的东西 - 我怎样才能让它发挥作用?谢谢!
我试过这段代码,一切正常
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:
只需将 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")
}
}
希望对你有用。
称之为
self.navigationItem.titleView = searchController.searchBar
来自 viewWillAppear(),而不是来自 viewDidLoad()。委托方法工作正常。
我想实现一些非常简单的事情:导航栏中的搜索栏,带有一个取消按钮,该按钮在该栏被激活时显示。
我正在使用 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 中进行了广泛的搜索,但似乎没有任何内容适合我。我可能在这里遗漏了一些明显的东西 - 我怎样才能让它发挥作用?谢谢!
我试过这段代码,一切正常
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:
只需将 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")
}
}
希望对你有用。
称之为
self.navigationItem.titleView = searchController.searchBar
来自 viewWillAppear(),而不是来自 viewDidLoad()。委托方法工作正常。