2017-04-25 89 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的方法编辑你的问题 –

相关问题