2016-07-25 3 views
0

저는 앱에서 UISearchController를 구현하려고 시도했으며 참조 용으로는 this 튜토리얼을 따랐습니다. 튜토리얼은 필자가 필요로했던 것보다 더 많은 것을 다루었 다 (스코프와 같은). 그래서 나는 그것을 훑어 보았다. 그러나 테스트 애플리케이션을 실행했을 때, 검색은 작동하지 않았다. 검색 창에 입력 할 때 "검색"을 눌렀는지 여부에 관계없이 입력 한 첫 번째 문자에 대한 결과 만 필터링했습니다. 예를 들어, "dolphin"을 입력하면 "d"가 포함 된 결과 만 표시됩니다. updateSearchResultsForSearchController 안에 인쇄함으로써, 나는 그것이 단지 한 번 불렀다는 것을 확인했다.iOS updateSearchResultsForSearchController는 한 번만 호출되었습니다.

그러나 검색 창에서 모든 항목을 삭제하면 결과가 다시 필터링되지 않고 다시 입력됩니다.

here 제안 된 해결 방법을 시도했지만 여전히 문제가 지속됩니다.

class SearchController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { 
    let data = [ 
     "bottlenose dolphin": 111, 
     "manta ray": 172, 
     "humphead wrasse": 388, 
     "Commerson's dolphin": 19 
     // etc. 
    ] 

    var results = [String: Int]() 
    let searchController = UISearchController(searchResultsController: nil) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     searchController.searchResultsUpdater = self 
     searchController.searchBar.delegate = self 
     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 
     tableView.tableHeaderView = searchController.searchBar 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if searchController.active && searchController.searchBar.text != "" { 
      return results.count 
     } else { 
      return data.count 
     } 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
     if searchController.active && searchController.searchBar.text != "" { 
      let index = results.startIndex.advancedBy(indexPath.row) 
      cell.textLabel!.text = results.keys[index] 
     } else { 
      let index = data.startIndex.advancedBy(indexPath.row) 
      cell.textLabel!.text = data.keys[index] 
     } 
     return cell 
    } 

    func search(searchText: String) { 
     let temp = data.filter({(element: (String, Int)) -> Bool in 
      return element.0.lowercaseString.containsString(searchText.lowercaseString) 
     }) 
     for element in temp { results[element.0] = element.1 } 
     tableView.reloadData() 
    } 

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
     updateSearchResultsForSearchController(searchController) 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     search(searchController.searchBar.text!) 
    } 
} 

이 튜토리얼을 감추고 때이 단계를 놓친 기회입니다,하지만 난 아무 소용이 그것을 통해 몇 번 더 검토 한 결과이 내 코드입니다. 검색을 제대로 수행하려면 어떻게해야합니까?

편집 : 또한 검색의 첫 번째 문자가 포함되지 않은 검색 결과가 나타납니다. 예를 들어 다른 데이터 세트를 사용하여 "J"를 검색하면 "Silicon Valley"가 나타났습니다 ...

답변

1

이전 results을 삭제하는 것을 잊지 마십시오.

func search(searchText: String) { 
    let temp = data.filter({(element: (String, Int)) -> Bool in 
     return element.0.lowercaseString.containsString(searchText.lowercaseString) 
    }) 
    results.removeAll() // clear previous ones 
    for element in temp { results[element.0] = element.1 } 
    tableView.reloadData() 
} 
+0

나는 그처럼 간단한 것을 간과했다고 생각할 수 없다! 이제 검색이 작동합니다. 감사합니다! – Technicolor

+0

같은 문제가 발생했습니다. 고마워. –