2017-04-25 3 views
0

UIViewController가 있고 UITableView가 있고 그 tableview 안에 일부 항목이있는 여러 섹션이 있는데 해당 tableview 내에서 itemname으로 검색해야합니다. 내보기 컨트롤러Search Controller (여러 섹션이있는 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() 
} 

이를 선언 한 그리고 난에 절하지 않고 내가 노력 모든 솔루션 How can I filter an array of dictionaries in 'updateSearchResultsForSearchController' to search a UITableView with Swift

을이 질문을 참조하지만, 찾을 수 있었다 SearchResultUpdate

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

의 확장을 위의 질문은 또한 적절한 결과를 보이지 않습니다. 고맙습니다!!

+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

나는 완벽한 결과를 보여주는 디버깅을했지만 내 테이블 뷰는 완벽하게 보이지 않는다. –

+0

tableView의 디버깅 방법을 시도해 봤나? 가능한 경우 현재 tableView 메서드를 사용하여 질문을 편집하십시오. –