2016-07-25 3 views
0

Я пытался реализовать UISearchController в приложении, а в качестве ссылки я следовал this учебнику. Учебник охватывал немного больше, чем мне нужно (например, область), поэтому я только просматривал его, но когда я запускал тестовое приложение, поиск не работал. Когда я набирал строку поиска, она только отфильтровывала результаты для первого введенного мной символа, независимо от того, нажал ли я «поиск» или нет. Например, если я набрал «дельфин», он будет показывать только результаты, содержащие «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» всплыл «Силиконовая долина» ...

ответ

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

столкнулся с той же проблемой. благодарность bluedome –

Смежные вопросы