1. 程式人生 > >swift UI專項訓練37 實時顯示搜尋結果的搜尋框SearchBar

swift UI專項訓練37 實時顯示搜尋結果的搜尋框SearchBar

    今天我們來講點高階點的知識,在搜尋框中輸入關鍵字,下方的tableView自動匹配包含關鍵字的結果。用我最近在做的一款美食類APP為例。

在storyboard中拖入一張表,然後與Vc中的程式碼關聯起來:

@IBOutlet weak var tableView: UITableView!

獲取我們所需要的菜品資訊:
var caipins = CaipinArray().caipinArray
    var searchResults = [caipin]()

caipins是所有的菜品,searchResults是我們通過搜尋的菜品資訊,它們都是caipin類,caipin類是我們之前定義好的,格式如下:
import UIKit

class caipin: NSObject {
    var name:String = ""
    var rest:String = ""
    var price:Float = 0
    var score:Float = 0
    var image:String = ""
    var collected:Bool = false
    var taste:String = ""
    var nutrition:String = ""
    init(name:String,rest:String,price:Float,score:Float,image:String,collected:Bool,taste:String,nutrition:String){
    self.name = name
    self.rest = rest
    self.price = price
    self.score = score
    self.image = image
    self.collected = collected
    self.taste = taste
    self.nutrition = nutrition
    }
}

CaipinArray是一個賦值過的菜品類,就不演示程式碼了,然後我們讓vc繼承tableview的datasource和delegate,實現這兩個類的基本方法,本話重點不在這裡就不演示了。

然後我們定義一個UISearchController的類:

var searchController:UISearchController!

在viewDidLoad方法中加入以下程式碼:
self.tableView.tableFooterView = UIView(frame: CGRectZero)
       searchController = UISearchController(searchResultsController: nil)
        searchController.searchBar.sizeToFit()
        self.view.addSubview(searchController.searchBar)
        tableView.tableHeaderView = searchController.searchBar
        definesPresentationContext = true
為了清楚我提前在tableview中加入了一些資料。現在執行看看,是不是tableview的頂端出現了搜尋框:

點選搜尋框效果如下:


現在新建一個方法:

func filterContentForSearchText(searchText: String) {
        
        searchResults = caipins.filter({ ( caipin: caipin) -> Bool in
            
            let nameMatch = caipin.name.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
            let locationMatch = caipin.rest.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
            
            return nameMatch != nil || locationMatch != nil
            
        })
       IOS中給我們封裝好了一個filter(過濾),我們可以在已經存在的陣列中直接用,只需要在閉包中提供這個過濾的規則,以上的程式碼我們定義了兩個規則,一個是匹配菜品名字或者匹配菜品所屬的餐館名稱,返回的結果是一個布林型別,通知程式有沒有匹配的項。現在我們已經對輸入的搜尋關鍵字進行了判斷,那麼我們如何根據判斷結果來更新列表中的值呢?

首先要做的一點就是整合一個UISearchResultsUpdating的介面:

class SecondViewController: UIViewController,UITableViewDataSource,UISearchResultsUpdating

這個介面定義了一個叫做

updateSearchResultsForSearchController 的方法,當我們對搜尋框有任何操作的時候這個方法就會被呼叫,我們可以讓我們呢的search controller做我們的返回。現在來實現這個方法:

func updateSearchResultsForSearchController(searchController: UISearchController) {
        let searchText = searchController.searchBar.text
        
        filterContentForSearchText(searchText)
        
        tableView.reloadData()
    }

在這個方法中,我們得到使用者的輸入,傳給filterContentForSearchText方法,因為要在一張表中顯示輸出結果,所以最後要把表reload一下。接下來需要更新一下我們之前定義的方法。首先是tableView(_:numberOfRowsInSecton:)這個方法。search是否被使用者啟用是有一個識別符號的,我們可以直接使用,當被啟用的時候顯示搜尋集中的菜品,不然就不顯示:
 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
            return searchResults.count
        
    }

列表只顯示搜尋到的菜品資訊。接下來修改tableView(_:cellForRowAtIndexPath:)  方法
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let identiString = "sCell" //程式碼複用
        let cell = tableView.dequeueReusableCellWithIdentifier(identiString , forIndexPath: indexPath) as searchTableViewCell
       
        var caipin =
        caipins[indexPath.row]
        if searchResults.count != 0
        {
            println(searchResults.count)
            caipin = searchResults[indexPath.row]
        }
        
        cell.nameLabel.text = caipin.name
        cell.scoreLabel.text = "評分:" + "\(caipin.score)"
        cell.restLabel.text = "餐館:" + caipin.rest
        cell.priceLabel.text = "價格:" + "\(caipin.price)"
        cell.caipinImageView.image = UIImage(named: caipin.image)
        
        if caipin.collected == true {
            cell.shoucangImageView.image = UIImage(named: "heart_fill_28")
        }
        
        return cell
    }
因為如果沒有搜尋到的話我們的結果集是空的,如果直接返回給caipin的話會顯示空值。這是因為swift中向一個空陣列中插值只能用append或者+-,直接使用空陣列中的元素會報Cannot index empty buffer這個錯誤,所以思考再三我增加了一個判斷語句,如果搜尋結果集中沒有元素,那麼返回所有元素的集合,因為tableview的行數被我們定義成搜尋結果集的元素個數,所以此時表中依舊不顯示元素。當搜尋結果集中有值的時候,我們可以放心的使用它當中的元素和屬性。

最後一步,我們需要給viewDidLoad方法加入以下程式碼:

searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false

第一行指定當前類作為更新資料的結果集,而第二行是因為我們在當前的view中返回結果。

另外更改一下搜尋框中的水印文字:

searchController.searchBar.placeholder = "請輸入菜品或餐館"

快來執行看看效果吧。


回到搜尋介面發現列表中已經沒有東西了,在搜尋框中輸入一個“芳”:


可以看到菜品中和餐館中包含“芳”字的結果都顯示了出來!這就是swift的強大之處,只是用了很簡單的程式碼就實現了這麼好用的功能,快來試試吧。

相關推薦

swift UI專項訓練37 實時顯示搜尋結果搜尋SearchBar

    今天我們來講點高階點的知識,在搜尋框中輸入關鍵字,下方的tableView自動匹配包含關鍵字的結果。用我最近在做的一款美食類APP為例。 在storyboard中拖入一張表,然後與Vc中的程式碼關聯起來: @IBOutlet weak var tableView:

swift UI專項訓練39 用Swift實現搖一搖功能

當前 lac begin 捕獲 ports 畫面 respond lai mat 微信的搖一搖功能想必大家都用過,過春節的時候搶紅包也沒少搖吧,那麽用swift語言怎樣實現這麽酷炫的功能呢。搖動屬於IOS內置可識別的一種動作,在你須要實現搖動功能的viewco

swift UI專項訓練42 用Swift程式碼實現頁面跳轉與傳值

   之前我們做過如果要點選一個按鈕實現跳轉到另一個按鈕的辦法,有時候我們需要通過一些動作來觸發頁面的跳轉,比如搖動手機,這樣就不能直接用連線的辦法來實現跳轉了,那麼如何通過程式碼的方式來實現跳轉呢?依舊使用過渡的方法,在storyboard中把要實現跳轉的兩張頁面連線,注

實時顯示從file輸入中打開的圖片C:fakepath路徑問題

webkit ins alt container dom clas ref 元素 filters html代碼: <input id="file_upload" type="file" /> <div class="image_container"

QTextEdit實時顯示執行結果

最近用Qt介面程式用來處理序列影象的目標檢測,每次輸入一組序列圖,檢測結果(每一幀影象上目標的個數,對應座標,置信度等)除了以影象形式實時顯示意外,還需要以文字形式顯示在介面上。 我採用了QTextEdit控制元件來顯示文字。實現主要流程如下: 1,每一幀影象檢測完成後,呼

[Swift通天遁地]四、網路和執行緒-(9)上傳圖片並實時顯示上傳進度

本文將演示上傳圖片至伺服器,並實時顯示上傳的進度。 首先確保在專案中已經安裝了所需的第三方庫。 點選【Podfile】,檢視安裝配置檔案。 1 source 'https://github.com/CocoaPods/Specs.git' 2 platform :ios, '12.0' 3 u

android搜尋實時顯示 |中文轉拼音

首先說明漢字轉拼音: 一、使用Android自帶的HanziToPinyin.java檔案 利用該類主要實現以下兩種方法: 1、獲取漢字全拼 public String getFullPinYin(String source){ if (!Ar

ThinkPHP3.2.3---ajaxreturn的應用:一個在搜尋中輸入,實時動態顯示模糊搜尋結果

實現目標   在一個文字框中輸入關鍵詞,利用ajax和ajaxreturn實時顯示模糊搜尋的json資料。當然獲得了json資料,後期處理資料就隨你怎麼弄了。 最終實現效果 無任何動作

Ubuntu標題欄實時顯示資源管理器

實時 -a get span pos 安裝 運行 smon 添加 添加安裝資源包sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitorsudo apt-get update安裝更新sudo apt-get i

基於Jquery插件Uploadify實現實時顯示進度條上傳圖片

準備 深入學習 pla 回調 true bar put and 分割 網址:http://www.jb51.net/article/83811.htm 這篇文章主要介紹了基於Jquery插件Uploadify實現實時顯示進度條上傳圖片的相關資料,感興趣的小夥伴們可

PHP實時顯示輸出

index sleep 顯示 dex 關閉 bsp flush set mit //實時顯示輸出 ob_end_flush();//關閉緩存 //echo str_repeat(" ",256); //ie下 需要先發送256個字節 set_time_limit(0); f

用JS實現實時顯示系統時間

class mon 星期 itl utf sso inner watermark cti 下面為大家附上代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset=

js實現圖片上傳實時顯示

input res window splay ack 顯示 style rip 是否 在開發的時候經常遇到這樣的需求,用戶在上傳圖片的時候,想要看到自己上傳的圖片是否正確,這時候需要把用戶上傳的圖片及時顯示出來,然後等他點擊上傳的時候,程序再執行上傳到服務器。 <!

CRM product UI裏assignment block的顯示隱藏邏輯

ews time ril ssi 用戶 assign pla work relation 我們在product overview page裏能看到很多的assignment block。但是runtime的時候真正顯示出來的內容只是configuration裏面看到內容的一

linux 實時顯示文件的內容

desc end 運行 lin 參數 實時監控 output inux 內容 1. watch -n 1 aa.txt #每個1秒顯示aa.txt的內容 2. tail -f ***.log Linux shell中有一個tail命令,常用來顯示一個文件的最後n

上傳圖片實時顯示 兼容 ie11

IT chan nsf btn obj files text this BE html: <style type="text/css">   .imgOnloadWrap{ width: 150px; height: 200px;}   #img1{ wid

軍事實時顯示圖形工作站介紹

有限元 科技 動態 設計 網絡遊戲 png jpg 建築 顯示 現代戰爭強調C4ISR技術,指揮中心在千裏萬裏之外,要通過信息化技術對整個海、陸、空、天、電磁戰場進行全面的了解、掌握和指揮控制,那麽傳統指揮部裏的行軍地圖、模型沙盤就已經不敷使用了。扁平化的戰場

頁面時間日期星期實時顯示

TE doc 顯示 tel interval h+ 小時 num 定時 //定時器每秒調用一次fnDate() setInterval(function(){   fnDate(); },1000); //js 獲取當前時間 function fnDate

WebSocket實現數據庫更新前臺實時顯示

throwable implement 技術 exception endpoint CA 建立 round 新頁面 通過一個小實例來實現數據庫更新後,推送消息給前臺,讓前臺進行相應操作。 需求 數據庫更新之後服務器推送消息給前臺,讓前臺做操作。(數據庫的數據不是由服務器寫入

在python3下使用OpenCV 抓取攝像頭圖像並實時顯示3色直方圖

rom vid mar inline oat ima tps ble log 以下代碼為在Python3環境下利用OpenCV 抓取攝像頭的實時圖像, 通過OpenCV的 calHist函數計算直方圖, 並顯示在3個不同窗口中.import cv2 import numpy