UISearchController 出来挑土豆 Day 18

实现SearchBar的使用:

UISearchController的实现

可以先看下面的成果是不是想要的效果

1. 完成准备工作

  • 宣吿所需要的物件
    • UISerachController:searchController
    • Firebase的reference:ref
    • 储存从Firebase下载的资料:Data
    • 储存从Data中搜寻出相应资料的:Filter
  • 使用的Method
    • 设定searchController
    • 储存Firebase线上资料到本地
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"
}

}

2. 建构过滤的func

有了这些资料,现在需要一个过滤的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
		}

}

3. 执行过滤func & 更新资料的func

继承UISearchResultsUpdating的委派,会自动产生的upadateSearchResults(for searchController:)

传入SearchController内的searchBar文字,让视图可以执行过滤的func

有了更新後的资料,就要负责更新视图

// 负责更新结果的func
func updateSearchResults(for searchController:UISearchController){
	
	if let searchText = searchController.searchBar.text{
			// 执行搜寻
			filterContent(searchText)
			// 搜寻过後重新载入
			tableView.reloadData()

}

4. 更新的资料呈现在TableViewCell中

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
}

成果展示:

https://i.imgur.com/Iq9EyOj.gif


参考网址:

如何利用UISearchController添加搜寻功能并打造客制化搜寻列

iOS 14 App程序设计实战心法


<<:  第 7 集:你有 Flex Style 吗?

>>:  GitHub Advanced Security - 秘密扫描 (Secret Scanning)

SQL Server Agent 权限 - 心得分享

DBABootcamp 没有 SA 权限的使用者,要如何管理 SQL Agent Jobs (作业)...

# Day8--物件兄弟党的小弟们:属性与方法

在上一篇的文章中,有提到属性(property)这件事情指的就是类别或结构里面的所包含的变数、常数,...

从零开始学3D游戏设计:入门程序实作 Part.2 杀死玩家

这是 Roblox 从零开始系列,入门章节的第八个单元,今天你将学会如何透过脚本来让玩家掉到岩浆上之...

【Day28】一些面试相关的题目

7年资深 iOS 开发工程师,5 道题全面考察候选人,看看你能过几招? 今天看到觉得好像蛮重要的,所...

[DAY03] 建立 Datastore 和 Dataset (上)

DAY03 建立 Datastore 和 Dataset (上) 我们都知道做 AI 最重要的就是 ...