2017-03-21 25 views
0

的iOS,斯威夫特如何使用搜索欄搜索多個視圖? (iOS版雨燕)

的應用程序現在做什麼?:

這個應用程序的主視圖包含類別(排列成表視圖),點擊這些類別時,應用程序將用戶帶到帶有基本文本的滾動視圖和圖像。主視圖還包含一個搜索欄。用戶可以輸入類別名稱並過濾結果。

什麼應用程序需要做的:

我想更好的搜索欄和過濾後的結果。我希望用戶能夠過濾類別名稱,不僅可以輸入類別名稱,還可以輸入包含在特定滾動視圖中的文本。

例如:類別名稱爲:「字母」和「數字」。當用戶點擊「字母」時,它們被帶到一個表示「A B C D ... Z」的視圖,當點擊「Numbers」時,它們被帶到「1 2 3 4 .. 10」的視圖。如果用戶在搜索欄中輸入「A B」,則主視圖將僅顯示「字母」類別。如果用戶在搜索欄中輸入「3」,則主視圖將過濾僅顯示「Numbers」類別。

在結論:

我還是相當新的應用程序開發,這有我難住了。任何幫助將不勝感激,無論是代碼或參考。

謝謝。

TableViewController

變量:

@IBOutlet var searchForTool: UISearchBar! 
@IBOutlet var toolTable: UITableView! 

var searchActive : Bool = false 
var filtered : [String] = [] 
var data = [" Make", " Model"] 
var identities = ["A", "B"] 

搜索欄過濾器:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    filtered = data.filter({ (text: String) -> Bool in 

     return text.range(of: searchText, options: String.CompareOptions.caseInsensitive) != nil 
    }) 

    if(filtered.count == 0){ 
     searchActive = false 
    } else { 
     searchActive = true 
    } 
    self.toolTable.reloadData() 
} 

顯示的單元格:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 

    if(searchActive){ 
     cell.toolLabel.text = filtered[indexPath.row] 
    } else { 
     cell.toolLabel.text = data[indexPath.row] 
    } 
    return cell 
} 

如果需要,將顯示更多代碼。

+0

添加代碼和截圖,將有助於 –

+0

好吧,我會從TableViewController –

回答

0

這裏有一些問題:

  • 如何構建你的數據?

爲解決這個我會去這樣的事情:

class Item { 
    var name: String! 
    init(name: String) { 
     self.name = name 
    } 
} 

class Category { 
    var items = [Item]() 
    var name: String! 

    init(items: [Item], name: String) { 
     self.items = items 
     self.name = name 
    } 
} 

您可以使用它像這樣:

let letterItems = [Item(name: "A"), Item(name: "B"), Item(name: "C")] 
let lettersCategory = Category(items: letterItems, name: "Letters") 

let numberItems = [Item(name: "1"), Item(name: "2"), Item(name: "3")] 
let numbersCategory = Category(items: numberItems, name: "Numbers") 

let cat: [Category] = [lettersCategory, numbersCategory] 
  • 如何定義你的搜索?

在這裏,你可以有多種選擇:

  1. 搜索文本需要,因爲它是寫在任何category.name或item.name的被發現了:「AB」會不會在這種情況下在任何item.name中找到。如果搜索是 「A」 - > 「字母」 匹配

    let searchItem = "A" 
    
    let result = cat.filter({ $0.name.range(of: searchItem) != nil || $0.items.filter({$0.name.range(of: searchItem) != nil }).count > 0}) 
    
  2. 一個 「或」 搜索,如谷歌的作用:通過 「」

    • 第一單獨搜索字符串每個元素並使用相同的方法類似於上面 -
    • 弄平結果
    • 添加至results可變
    • continu e爲下一個字
+0

添加一些代碼,謝謝你的迴應,抱歉沒有提供我的代碼結構早期(我現在有)。正如你所看到的,我們的結構不同。但是我會進一步檢查你的代碼,這可能會讓我更接近解決方案。 –

+0

你需要鏈接你的實體:'數據'與'身份',以便你可以做一個級聯過濾器。 –

+0

我會如何去做這件事。從我讀的這些數據聽起來相當複雜。使用雙二次過濾函數,vDSP API等 –