UISearchController 讓用戶在 UISearchBar 上輸入搜索關鍵詞,展示搜索結果或者進行其他操作。UISearchController 把兩個控制器(UIViewController)連在一起。父控制器放置 UISearchBar 控件。當用戶點擊搜索框時,UISearchBar 會移到屏幕頂部;輸入搜索關鍵詞,UISearchBar 下面出現子控制器的view
。當然,也可以用代碼使 UISearchBar 和子控制器展示出來,即便父控制器沒有放置 UISearchBar。
在父控制器中創建子控制器
用子控制器創建 UISearchController,通常會把 UISearchController 變成父控制器的屬性
設置 UISearchController 的
searchResultsUpdater
屬性通常會在父控制器上放置 UISearchController 的
searchBar
把父控制器
definesPresentationContext
屬性設置為 true
以下為父控制器代碼示例
let searchResultsVC = SearchResultsVC(allStrings: allStrings)
searchController = UISearchController(searchResultsController: searchResultsVC)
searchController.searchResultsUpdater = searchResultsVC;
let tableView = UITableView(frame: view.bounds)
tableView.dataSource = self
view.addSubview(tableView)
tableView.tableHeaderView = searchController.searchBar;
tableView.tableFooterView = UIView()
definesPresentationContext = true;
UISearchController 的searchResultsUpdater
屬性一般設置為父控制器或子控制器。這個屬性的值要符合 UISearchResultsUpdating 協議,實現updateSearchResults(for searchController: UISearchController)
方法。這個方法會在searchBar
變為第一響應者(比如,當用戶點擊搜索框,鍵盤彈出),以及搜索關鍵詞改變時調用。在這個方法中寫入執行搜索、更新 UI 的代碼。
以上代碼將子控制器作為 UISearchController 的searchResultsUpdater
。假設子控制器的數據源為 allStrings 和 strings,均為含 String 的 Array。其中,allStrings 為常量,包含所有的 String;strings 包含符合搜索條件的 String,需要在用戶輸入時更新。搜索條件為,含有用戶輸入的內容,不區分大小寫。用 UITableView 展示搜索結果。在updateSearchResults(for searchController: UISearchController)
方法中,獲取 searchBar 的text
,更新 strings,更新 UI。
以下是子控制器代碼示例
func updateSearchResults(for searchController: UISearchController) {
strings.removeAll()
if let text = searchController.searchBar.text?.uppercased(), !text.isEmpty {
strings = allStrings.filter { $0.contains(text) }
}
tableView.reloadData()
}
默認情況下,用戶點擊搜索框,導航欄(navigation bar)隱藏,UISearchBar 上移,下面能看到父控制器,但有灰色蒙版遮擋。點擊灰色蒙版,退回父控制器。把 UISearchController 的hidesNavigationBarDuringPresentation
屬性設置為false,則導航欄不隱藏。把 UISearchController 的dimsBackgroundDuringPresentation
屬性設置為false,則灰色蒙版不顯示,能點擊父控制器。
如果 UISearchController 的searchBar
已經放置在父控制器上,用戶點擊搜索框時,UISearchBar 會上移至屏幕頂部,鍵盤彈出。此時會調用updateSearchResults(for searchController: UISearchController)
方法,但子控制的view
沒有出現,isHidden
為 true。輸入內容後,子控制器的view
才出現。清空輸入的內容,子控制器的view
消失。如果要在搜索框為空時也顯示子控制器,在updateSearchResults(for searchController: UISearchController)
方法中加入searchController.searchResultsController?.view.isHidden = false
即可。
在父控制中可以用代碼來展示 UISearchBar 和子控制器,具體實現方法要看 UISearchController 的searchBar
是否放置在父控制器上。
searchBar
放置在父控制器上searchController.searchBar.becomeFirstResponder()
present(searchController, animated: true, completion: nil)
或者
searchController.isActive = true
searchBar
不在父控制器上present(searchController, animated: true, completion: nil)
搜索框一出來就成為第一響應者,鍵盤會彈出,不知道怎麼禁止鍵盤彈出。當然,展示搜索框卻不彈出鍵盤,是奇怪的需求。
代碼已上傳GitHub:https://github.com/Silence-GitHub/SearchControllerDemo
轉載請注明出處:http://www.cnblogs.com/silence-cnblogs/p/6405545.html