2017-04-25 8 views
0

Ich habe einen UIViewController, in dem ich eine UITableView habe und innerhalb dieser Tabellenansicht habe ich mehrere Abschnitte, die ein Element haben, und ich muss mit itemname innerhalb dieser Tabellenansicht suchen. Ich habe diese Controller in meiner Sicht erklärtSuche Controller mit mehreren Abschnitt in 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() 
} 

Und ich habe eine Verlängerung der SearchResultUpdate

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

ich diese Frage verweisen hatte aber keine Lösung How can I filter an array of dictionaries in 'updateSearchResultsForSearchController' to search a UITableView with Swift

ich ohne den Abschnitt versuchte gefunden Die oben genannte Frage zeigt dann auch keine korrekten Ergebnisse. Vielen Dank!!

+0

Ich hatte einen Filtercode hinzugefügt, der nur für ein Array ist, d. H. ItemA, weil ich nicht für mehrere Arrays implementieren kann. @NiravD –

+0

Es gibt eine Möglichkeit, nur einzelne Abschnitte anzuzeigen, wenn Sie Daten filtern –

+0

Können wir nicht in allen Abschnitt suchen. –

Antwort

2

Ein Weg für Sie ist, wenn Sie Arbeit mit einzelnen Abschnitt filtern, also ändern Sie zuerst Ihre filteredshops wie diese Weise.

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() 
} 

Jetzt mit TableView-Methode ändern Sie wie folgt.

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

Ich implementierte mit der oben genannten Lösung, aber es zeigt nichts, wenn der Such-Controller aktiv ist, ist alles leer, aber Abschnitte werden angezeigt und wenn ich suchte, gibt es keine richtigen Ergebnisse. –

+0

Ich habe das Debugging durchgeführt, es zeigt perfekte Ergebnisse, aber in meiner Tabellenansicht nicht perfekt –

+0

Haben Sie versucht, debuggen tableView Methoden? Wenn möglich, editiere deine Frage mit deiner aktuellen TableView-Methode –

Verwandte Themen