iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
自我挑戰組

一個令我自豪的App完成之路系列 第 18

UISearchController 出來挑土豆 Day 18

  • 分享至 

  • xImage
  •  

實現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程式設計實戰心法


上一篇
使用Google api查詢書本資訊 Day 17
下一篇
AVFoundation 來看看 Day 19
系列文
一個令我自豪的App完成之路32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言