实现SearchBar的使用:
UISearchController的实现
可以先看下面的成果是不是想要的效果
import Firebase
import UIKit
class searchTableViewController:UITableView,UISearchResultsUpdating{
// 宣告一个UISearchController
var searchController:UISearchController!
// 宣告一个ref,因为要提取Firebase资料库内的资料
var ref:DatabaseReference!
// 宣告储存等等搜寻的资料的Array
var Data:[Book] = []
var Filter:[Book] = []
override func viewDidLoad(){
super.viewDidLoad()
ConfigSearchController()
ConfigDatabase()
}
func ConfigDatabase(){
// 建立一个Firebase的reference
ref = Database.database().reference(withPath:"Book")
// (.queryOrdered)透过child搜寻到资料,(.observe)提取资料中的value
// Firebase提供的资料都会是snapshot
ref.queryOrdered(byChild:"booktitle").observe(.value,with:{(snapshot) in
let OnlineDataItem = [Book]()
// snapshot下面的所有child
for Items in snapshot.child{
// 初始化进入Book类型内
let book = Book(snapshot:Items as! DataSnapshot)
OnlineDataItem.append(book)
}
// 初始化自己的Data资料,成为网路上获取下来的资料
self.Data = OnlineDataItem
}
func ConfigSearchController(){
// 实例化UISearchController (让搜寻结果显示在与搜寻相同的视图)
searchController = UISearchController(searchResultsController:nil)
// 让SearchBar出现在tableView中
tableView.tableHeaderView = searchController.searchBar
// 指派执行searchController更新
searchController.searchResultsUpdater = self
// 设定search bar的placeholder
searchController.searchBar.placeholder = "Search What you want"
}
}
有了这些资料,现在需要一个过滤的func来替我们过滤出资料
Filter负责储存过滤後的资料
// 负责执行搜寻的func
func filterContent(for searchText:String){
// 使用filter函数会将符合的项目储存至Filter的Array内
Filter = Data.filter({(data) -> Bool in
let title = data.booktitle
// matched 为Boolean值
let matched = title.localizedCaseInsensitiveContains(searchText)
if matched{
return matched
}else{
return false
}
}
继承UISearchResultsUpdating的委派,会自动产生的upadateSearchResults(for searchController:)
传入SearchController内的searchBar文字,让视图可以执行过滤的func
有了更新後的资料,就要负责更新视图
// 负责更新结果的func
func updateSearchResults(for searchController:UISearchController){
if let searchText = searchController.searchBar.text{
// 执行搜寻
filterContent(searchText)
// 搜寻过後重新载入
tableView.reloadData()
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 先去生一个tableViewCell,设定好要呈现的Cell,将其identifier改成searchIdentifier
let cell = tableView.dequeueReusableCell(withIdentifier: "searchIdentifier", for: indexPath) as! SearchTableViewCell
// 用来辨识要用哪个资料来呈现在TableView上
let end = (searchController.isActive) ? Filter[indexPath.row] : Data[indexPath.row]
// 如果有启用searchController,显示Data的booktitle
if searchController.isActive{
cell.searchbooktitle.text = end.booktitle
cell.searchauthors.text = end.bookauthors
cell.searchbookisbn.text = end.bookISBN
}
else{
// 反之没有启用,则显示所有的Data资料
cell.searchbooktitle.text = end.booktitle
cell.searchauthors.text = end.bookauthors
cell.searchbookisbn.text = end.bookISBN
}
return cell
}
成果展示:
参考网址:
如何利用UISearchController添加搜寻功能并打造客制化搜寻列
>>: GitHub Advanced Security - 秘密扫描 (Secret Scanning)
DBABootcamp 没有 SA 权限的使用者,要如何管理 SQL Agent Jobs (作业)...
在上一篇的文章中,有提到属性(property)这件事情指的就是类别或结构里面的所包含的变数、常数,...
这是 Roblox 从零开始系列,入门章节的第八个单元,今天你将学会如何透过脚本来让玩家掉到岩浆上之...
7年资深 iOS 开发工程师,5 道题全面考察候选人,看看你能过几招? 今天看到觉得好像蛮重要的,所...
DAY03 建立 Datastore 和 Dataset (上) 我们都知道做 AI 最重要的就是 ...