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" ...
Ich kann nicht glauben, dass ich etwas so einfach übersehen habe! Die Suche funktioniert jetzt, danke! – Technicolor
konfrontiert das gleiche Problem. danke bluedome –