我想实现一些非常简单的操作:导航栏中的搜索栏,带有一个“取消”按钮,显示该栏何时被激活。
我正在使用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中进行了广泛搜索,但似乎没有任何工作对我有用。我可能在这里遗漏了一些明显的东西-如何使其工作?谢谢!
答案 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")
}
用户界面: