記錄下UISearchBar的基本用法,補充:ios 8.0以后,原來的UISearchDisplayController被官方廢棄,建議使用UISearchController,下面就簡單的記錄下這兩種控件的使用。
1,UISearchBar,代碼如下:
a,聲明
class NinethViewController: UIViewController,UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource
b,准備,創建所需要的變量
var searchBar:UISearchBar! var hTabV:UITableView! var ctrls:[String] = ["a","b","c","d","e"] var ctrlsel:[String] = []
c,具體方法和代理方法的實現
func creatUI(){ self.ctrlsel = self.ctrls self.searchBar = UISearchBar(frame:CGRect(x:0,y:64,width:kScreenWidth,height:50)) self.searchBar.delegate = self // self.searchBar.setShowsCancelButton(true, animated: true) // self.searchBar.showsSearchResultsButton = true self.searchBar.placeholder = "請輸入你想搜索的內容" // self.searchBar.showsCancelButton = false self.view.addSubview(self.searchBar) self.hTabV = UITableView(frame:CGRect(x:0,y:50+64,width:kScreenWidth,height:kScreenHeight-50)) self.hTabV.delegate = self self.hTabV.dataSource = self self.hTabV.tableFooterView = UIView() self.hTabV.register(UITableViewCell().classForCoder, forCellReuseIdentifier: "cell") self.view.addSubview(self.hTabV) }
補充,Options屬性,可設置如下功能樣式:
showsSearchResultsButton 搜索框右邊顯示一個圓形向下的按鈕,單機會發送特殊事件
showsBookmarkButton 搜索框右邊會顯示一個書本的按鈕,單機會發送特殊事件
showsCancelButton 搜索框右邊會出現一個“cancel”按鈕,單擊會發送特殊事件
isSearchResultsButtonSelected 搜索結果按鈕被選中
showsSearchResultsButton 搜索結果顯示按鈕
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { print(searchText) // 沒有搜索內容時顯示全部組件 if searchText == "" { self.ctrlsel = self.ctrls }else{ self.ctrlsel = [] for ctrl in self.ctrls { if ctrl.uppercased().hasPrefix(searchText.uppercased()) { self.ctrlsel.append(ctrl) } } } self.searchBar.endEditing(true) self.hTabV.reloadData() }
c,tableview具體代理方法的實現:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.ctrlsel.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let identiferStr:String = "cell" let cell = tableView.dequeueReusableCell(withIdentifier: identiferStr, for: indexPath) cell.textLabel?.text = "\(self.ctrlsel[indexPath.row])" cell.accessoryType = .disclosureIndicator return cell }
效果如下:
2,UISearchController的使用
func creatUIs(){ self.searchBar = UISearchBar(frame:CGRect(x:0,y:0,width:kScreenWidth,height:50)) self.searchBar.showsCancelButton = true //通過參數searchResultsController傳nil來初始化UISearchController,意思是我們告訴search controller我們會用相同的視圖控制器來展示我們的搜索結果,如果我們想要指定一個不同的view controller,那就會被替代為顯示搜索結果。 searchController = UISearchController(searchResultsController:nil) //設置代理,searchResultUpdater是UISearchController的一個屬性,它的值必須實現UISearchResultsUpdating協議,這個協議讓我們的類在UISearchBar文字改變時被通知到,我們之后會實現這個協議。 searchController.searchResultsUpdater = self as? UISearchResultsUpdating //默認情況下,UISearchController暗化前一個view,這在我們使用另一個view controller來顯示結果時非常有用,但當前情況我們並不想暗化當前view,即設置開始搜索時背景是否顯示 searchController.dimsBackgroundDuringPresentation = false //設置默認顯示內容 searchController.searchBar.placeholder = "Search here..." //設置searchBar自適應大小 searchController.searchBar.sizeToFit() //設置默認顯示內容 searchController.searchBar.delegate = self //設置definesPresentationContext為true,我們保證在UISearchController在激活狀態下用戶push到下一個view controller之后search bar不會仍留在界面上。 searchController.definesPresentationContext = true self.hTabV = UITableView(frame:CGRect(x:0,y:0,width:kScreenWidth,height:kScreenHeight)) self.hTabV.delegate = self self.hTabV.dataSource = self self.hTabV.tableFooterView = UIView() self.hTabV.register(UITableViewCell().classForCoder, forCellReuseIdentifier: "cell") //設置tableview的頭視圖為searchController.searchBar self.hTabV.tableHeaderView = searchController.searchBar self.view.addSubview(self.hTabV) }
其他的searchbar的代理方法和tableview的代理方法,和上面的一樣!
效果如下圖: