2017-04-25 86 views
0

我有一個UIViewController,其中有一個UITableView,並在該tableview中有多個部分有一些項目,我必須在該tableview中使用itemname進行搜索。我在我的視圖控制器在UITableView中有多個部分的搜索控制器

let searchController = UISearchController(searchResultsController: nil) 

override func viewDidLoad() { 
    super.viewDidLoad() 
    searchController.dimsBackgroundDuringPresentation = false 
    definesPresentationContext = true 
    tableView.tableHeaderView = searchController.searchBar 
    searchController.searchBar.barTintColor = UIColor(red: 39.0/255.0, green: 203.0/255.0, blue: 192.0/255.0, alpha: 1.0) 
    searchController.searchBar.tintColor = UIColor.white 
    searchController.searchBar.placeholder = "Search item" 

    var sections = [Category A, Category B, Category C] 
    var itemsA = [["Item": "item A","ItemId" : "1"],["Item": "itemB","ItemId" : "2"],["Item": "item C","ItemId" : "3"]] 
    var itemsB = [["Item": "item A","ItemId" : "1"],["Item": "itemB","ItemId" : "2"],["Item": "item C","ItemId" : "3"]] 
    var itemsC = [["Item": "item A","ItemId" : "1"],["Item": "itemB","ItemId" : "2"],["Item": "item C","ItemId" : "3"]] 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    if searchController.isActive { 
     return 1 
    } 
    return self.sections.count 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if searchController.isActive { 
     return filteredShops.count 
    } 
switch (section) { 
    case 0: 
     return itemsA.count 
    case 1: 
     return itemsB.count 
    default: 
     return itemsC.count 
    } 
} 

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

    if searchController.isActive { 
     let filter = filteredShops[indexPath.row] 
     cell.storeName.text = filter["itemName"] 
    } 
    switch (indexPath.section) { 
     case 0: 
      //Access itemsA[indexPath.row] 
     case 1: 
      //Access itemsB[indexPath.row] 
     default: 
      //Access itemsC[indexPath.row] 
    } 
return cell 
} 

func filteredshops(_ searchText: String, scope: String = "All") { 
    let filteredShopsA = storeLists.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    let filteredShopsB = medicalLists.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    let filteredShopsC = restaurantsLists.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    filteredShops = filteredShopsA + filteredShopsB + filteredShopsC 
    print(filteredShops) 
    tableView.reloadData() 
} 

宣佈這一點,我有SearchResultUpdate

extension NearByShopVC: UISearchResultsUpdating { 
    func updateSearchResults(for searchController: UISearchController) { 
     filteredshops(searchController.searchBar.text!) 
    } 
} 

的擴展,我是指這個問題,但沒有找到任何解決辦法How can I filter an array of dictionaries in 'updateSearchResultsForSearchController' to search a UITableView with Swift

我嘗試沒有在節上述問題也沒有顯示出正確的結果。謝謝!!

+0

我已經添加了一個過濾代碼,這只是一個數組,即itemA,因爲我不知道如何實現多個數組。 @NiravD –

+0

當您過濾數據時,有一種方法可以只顯示單個部分 –

+0

我們不能在所有部分中進行搜索。 –

回答

2

您的一種方式是當您使用單個部分過濾工作時,請首先像這樣更改filteredshops

func filteredshops(_ searchText: String, scope: String = "All") { 
    let filteredShopsA = itemA.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    let filteredShopsB = itemB.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    let filteredShopsC = itemC.filter({ item in 
     if let name = item["itemName"], let query = searchController.searchBar.text { 
      return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil 
     } 
     return false 
    }) 
    filteredShops = filteredShopsA + filteredShopsB + filteredShopsC 
    tableView.reloadData() 
} 

現在用tableView方法就像這樣改變。

func numberOfSections(in tableView: UITableView) -> Int { 
    if searchController.isActive { 
     return 1 
    } 
    return self.sections.count 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchController.isActive { 
     return filteredShops.count 
    } 
    switch (section) { 
    case 0: 
     return itemsA.count 
    case 1: 
     return itemsB.count 
    default: 
     return itemsC.count 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "StoreCell") as! UITableViewCell 
    if searchController.isActive { 
     //Access filteredShops array 
    } 
    else { 
     switch (indexPath.section) { 
     case 0: 
      //Access itemsA[indexPath.row] 
     case 1: 
      //Access itemsB[indexPath.row] 
     default: 
      //Access itemsC[indexPath.row] 
     } 
    } 
    return cell 
} 
+0

我使用上述解決方案實施,但沒有顯示任何內容,當搜索控制器處於活動狀態時,所有內容都是空白的,但部分顯示,並且當我搜索到它時,沒有給出正確的結果。 –

+0

我做了調試,顯示完美的結果,但在我的tableview中沒有完美顯示 –

+0

您是否嘗試過調試tableView的方法?如果可能的話用你當前的tableView的方法編輯你的問題 –

相關問題