上一篇 開始用Swift開發(fā)iOS 10 - 17 使用Core Data 是使用Core Data存儲數(shù)據(jù)销部,這一篇是添加搜索功能阻逮。
使用 UISearchController
UISearchController
是一個簡潔的創(chuàng)建搜索條和管理搜索結(jié)果的API谊囚。
通常情況下晚岭,為以table為基礎(chǔ)的app添加搜索條只需要下面三行代碼就可以了嗤无,searchResultsController
為nil
時搜索結(jié)果顯示就在當前搜索的頁面以當前的樣式顯示壶愤。
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
tableView.tableHeaderView = searchController.searchBar
為我的FoodPin應(yīng)用添加搜索條:
-
在
RestaurantTableViewController
中添加一個變量:var searchController: UISearchController!
-
在
viewDidLoad
中初始化:searchController = UISearchController(searchResultsController: nil) tableView.tableHeaderView = searchController.searchBar
這樣就添加了搜索條麦轰,但還每天添加搜索邏輯乔夯,搜索沒效。
篩選內(nèi)容
-
在
RestaurantTableViewController
中繼續(xù)添加一個變量款侵,用戶存儲篩選結(jié)果:var searchResults: [RestaurantMO] = []
-
添加篩選方法:
func filterContent(for searchText: String) { searchResults = restaurants.filter({ (restaurant) -> Bool in if let name = restaurant.name { let isMatch = name.localizedCaseInsensitiveContains(searchText) return isMatch } return false }) }
filter
是數(shù)組的一個方法末荐,它遍歷數(shù)組的每一項進行閉包中的操作,根據(jù)結(jié)果判斷是否刪除對應(yīng)項新锈,最后得到一個篩選的數(shù)組甲脏。
localizedCaseInsensitiveContains
方法用來判斷name中是否包含searchText(忽略大小寫)
更新搜索結(jié)果
-
讓
RestaurantTableViewController
“符合”UISearchResultsUpdating
協(xié)議:class RestaurantTableViewController: UITableViewController, NSFetchedResultsControllerDelegate, UISearchResultsUpdating
實現(xiàn)
UISearchResultsUpdating
協(xié)議:
中的updateSearchResults(for:)
方法,這個方法在搜索條被選則和輸入搜索字時調(diào)用:
func updateSearchResults(for searchController: UISearchController) {
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
tableView.reloadData()
}
}
- 更新
tableView(_:numberOfRowsInSection:)
妹笆。UISearchController
有一個isActive
屬性用來判斷搜索控制器當前活躍狀態(tài)块请。
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.isActive {
return searchResults.count
} else {
return restaurants.count
}
}
- 更新
tableView(_:cellForRowAt:)
。根據(jù)UISearchController
的狀態(tài)判斷是從restaurants
中獲取數(shù)據(jù)還是searchResults
拳缠。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier,
for: indexPath) as! RestaurantTableViewCell
let restaurant = (searchController.isActive) ? searchResults[indexPath.row] : restaurants[indexPath.row]
cell.nameLabel.text = restaurant.name
cell.thumbnailImageView.image = UIImage(data: restaurant.image! as Data)
cell.thumbnailImageView.layer.cornerRadius = 30.0
cell.thumbnailImageView.clipsToBounds = true
cell.locationLabel.text = restaurant.location
cell.typeLabel.text = restaurant.type
cell.accessoryType = restaurant.isVisited ? .checkmark: .none
return cell
}
- 實現(xiàn)一個新的方法墩新,讓table在搜索狀態(tài)下不可以滑動編輯。
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if searchController.isActive {
return false
} else {
return true
}
}
-
更新
prepare(for:)
窟坐,讓segue在傳輸數(shù)據(jù)到detail view時的數(shù)據(jù)也相對應(yīng)海渊。destinationController.restaurant = searchController.isActive ? searchResults[indexPath.row] : restaurants[indexPath.row
在
viewDidLoad
中添加兩行代碼:
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
現(xiàn)在就完成了搜索功能。
定制搜索條的樣式
UISearchBar
提供一些屬性用來定制哲鸳。在viewDidLoad
中添加:
searchController.searchBar.placeholder = "Search restaurants..."
searchController.searchBar.tintColor = UIColor.white
searchController.searchBar.barTintColor = UIColor(red: 218.0/255.0, green:
100.0/255.0, blue: 70.0/255.0, alpha: 1.0)
Exercise:添加地址搜索
只需要更改搜索函數(shù)filterContent
:
searchResults = restaurants.filter({
(restaurant) -> Bool in
if let name = restaurant.name, let location = restaurant.location {
let isMatchName = name.localizedCaseInsensitiveContains(searchText)
let isMatchLocation = location.localizedCaseInsensitiveContains(searchText)
if isMatchName || isMatchLocation {
return true
}
}
return false
})
代碼
Beginning-iOS-Programming-with-Swift
說明
此文是學習appcode網(wǎng)站出的一本書 《Beginning iOS 10 Programming with Swift》 的一篇記錄
系列文章目錄
- 開始用Swift開發(fā)iOS 10 - 1 前言
- 開始用Swift開發(fā)iOS 10 - 2 Hello World臣疑!第一個Swift APP
- 開始用Swift開發(fā)iOS 10 - 3 介紹Auto Layout
- 開始用Swift開發(fā)iOS 10 - 4 用Stack View設(shè)計UI
- [開始用Swift開發(fā)iOS 10 - 5 原型的介紹]
- 開始用Swift開發(fā)iOS 10 - 6 創(chuàng)建簡單的Table Based App
- 開始用Swift開發(fā)iOS 10 - 7 定制Table Views
- 開始用Swift開發(fā)iOS 10 - 8 Table View和UIAlertController的交互
- 開始用Swift開發(fā)iOS 10 - 9 Table Row的刪除, UITableViewRowAction和UIActivityViewController的使用
- 開始用Swift開發(fā)iOS 10 - 10 Navigation Controller的介紹和Segue
- 開始用Swift開發(fā)iOS 10 - 11 面向?qū)ο缶幊探榻B
- 開始用Swift開發(fā)iOS 10 - 12 豐富Detail View和定制化Navigation Bar
- 開始用Swift開發(fā)iOS 10 - 13 Self Sizing Cells and Dynamic Type
- 開始用Swift開發(fā)iOS 10 - 14 基礎(chǔ)動畫,模糊效果和Unwind Segue
- 開始用Swift開發(fā)iOS 10 - 15 使用地圖
- 開始用Swift開發(fā)iOS 10 - 16 介紹靜態(tài)Table Views徙菠,UIImagePickerController和NSLayoutConstraint
- 開始用Swift開發(fā)iOS 10 - 17 使用Core Data