Swift 版本: 1.使用UISearchController製作一個簡單的本地搜尋應用
阿新 • • 發佈:2018-12-30
在前面, 我們講解了很多 UIKit 的控制元件知識, 現在讓我們來簡單的應用一下, 看看我們是怎麼去使用這些 UIKit 進行 App 的開發, 廢話少說, 讓我們直接來進入主題~
1.搭建頁面
我這裡是使用了一個 VIewController 作為控制器, 然後把 ViewController 交給了 UINavigationController 管理, 關於怎麼快速交給 UINavigationController 管理, 在之前的文章我演示過, 在這次再做一次.
2.實現程式碼
遵守代理協議, 資料來源協議
class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {
}
設定資料, 例項化UISearchController
var tableData = ["guangdong", "guangxi", "guangnan", "guangbei", "shanghai", "xiahai", "hunan", "hubei", "hudong", "huxi"]
var filteredData:[String] = []
var resultSearchController = UISearchController()
實現UITableView的代理方法以及資料來源方法
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if resultSearchController.active {
return filteredData.count
} else {
return tableData.count
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as! UITableViewCell
if resultSearchController.active {
cell.textLabel?.text = filteredData[indexPath.row]
} else {
cell.textLabel?.text = tableData[indexPath.row]
}
return cell
}
實現UISearchController的搜尋更新方法
// 當 UISearchController 變成第一響應者的時候呼叫
func updateSearchResultsForSearchController(searchController: UISearchController) {
// 刪除 filteredData 裡的所有元素, 並且預設的儲存為 false
filteredData.removeAll(keepCapacity: false)
// 輸入篩選文字, 獲取之後會自動去記憶體中搜索關鍵字, SELF CONTAINS[c] 這句話是匹配規則的寫法, 直接照抄就可以了
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
// 從 tableData 中篩選輸入的關鍵字
let array = (tableData as NSArray).filteredArrayUsingPredicate(searchPredicate)
// 再把篩選出來的關鍵字加入到filtereData
filteredData = array as! [String]
// 重新整理TableView
self.myTableView.reloadData()
}
設定UISearchController
func serachController() -> UISearchController{
// 例項化 UISearchController, 並且設定搜尋控制器為 nil
let controller = UISearchController(searchResultsController: nil)
// 設定更新搜尋結果的物件為 self
controller.searchResultsUpdater = self
// 設定 UISearchController 是否在編輯的時候隱藏NavigationBar, 預設為 true
controller.hidesNavigationBarDuringPresentation = false
// 設定 UISearchController 是否在編輯的時候隱藏背景色, 預設為 true
controller.dimsBackgroundDuringPresentation = false
// 設定 UISearchController 搜尋欄的 UISearchBarStyle 為Prominent
controller.searchBar.searchBarStyle = UISearchBarStyle.Prominent
// 設定 UISearchController 搜尋欄的 Size 是自適應
controller.searchBar.sizeToFit()
// UISearchController可以設定在三個地方
// 1.設定 navigationItem 的 titleView 為 UISearchController
self.navigationItem.titleView = controller.searchBar
// 2.設定 TableView 的 tableHeaderView 為controller.searchBar
// self.myTableView.tableHeaderView = controller.searchBar
// 3.設定 TableView 的偏移量, 使 UISearchController 預設就隱藏在 NavigationBar 下
// self.myTableView.contentOffset = CGPointMake(0, CGRectGetHeight(controller.searchBar.frame))
// 以上三種方法任選一種即可, 這裡預設的是第一種
// 返回設定好的 UISearchController
return controller
}
最後在viewDidLoad 中實現所有方法
override func viewDidLoad() {
super.viewDidLoad()
myTableView.delegate = self
myTableView.dataSource = self
resultSearchController = serachController()
}
3.最終效果圖
第一種
第二種
第三種
好了, 這次就講到這裡, 下次我們繼續~~