2016-07-25 12 views
0

Ich habe versucht, eine UISearchController in einer App zu implementieren, und als Referenz folgte ich this Tutorial. Das Tutorial behandelte ein wenig mehr als ich brauchte (wie der Umfang), also habe ich es nur überflogen, aber als ich meine Test-App ausgeführt habe, hat die Suche nicht funktioniert. Wenn ich die Suchleiste eintippte, filterte es nur Ergebnisse für das erste Zeichen, das ich eintippte, unabhängig davon, ob ich "Suchen" drückte oder nicht. Zum Beispiel, wenn ich "Delphin" eintippte, würde es nur Ergebnisse anzeigen, die "d" enthielten. Indem ich innerhalb updateSearchResultsForSearchController druckte, bestätigte ich, dass es nur einmal angerufen wurde.iOS updateSearchResultsForSearchController nur einmal aufgerufen

Wenn ich jedoch alles in der Suchleiste löschte, würden die Ergebnisse wieder ungefiltert sein, und wenn ich etwas erneut eintippte, würde es (wieder) nur nach dem ersten Zeichen filtern.

Ich habe auch versucht, die Problemumgehung vorgeschlagen here, aber das Problem weiterhin bestehen. Dies ist mein Code:

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

Es gibt die Chance, dass ich einen Schritt verpasst, wenn das Tutorial Skimming, aber ich habe durch sie mehrere Male ohne Erfolg aussah. Wie kann ich die Suche ordnungsgemäß durchführen?

Edit: Ich bemerkte auch, dass manchmal die Suche Pop-up-Ergebnisse, die nicht einmal das erste Zeichen der Abfrage enthalten würde. Zum Beispiel, mit einem anderen Satz von Daten, Suche "J" Pop-up "Silicon Valley" ...

Antwort

1

Sie vergessen, vorherige results zu entfernen.

+0

Ich kann nicht glauben, dass ich etwas so einfach übersehen habe! Die Suche funktioniert jetzt, danke! – Technicolor

+0

konfrontiert das gleiche Problem. danke bluedome –

Verwandte Themen