So verwende ich eine searchResultsController
, die ein Array von Strings nimmt, und zeigt sie in einer Tabellenansicht (Es ist eine Autocomplete-Liste). Wenn der Benutzer die 'Suchen' Taste auf der Tastatur drückt und der eingegebene String noch nicht in meiner Tabellenansicht ist, möchte ich ihn hinzufügen und die Tabellenansicht entsprechend aktualisieren.Wie aktualisiert man die Daten von der searchResultsController (UISearchController)
Das Problem ist, dass, sobald ich eine Zeichenfolge zum Array hinzugefügt und eine neue Suche, das Array nicht mit dem neuen Wert aktualisiert wird!
Hier ist mein Code:
In meinem ViewDidLoad() auf der Overview.swift Klasse
class Overview: UIViewController,UISearchControllerDelegate,UISearchBarDelegate,UICollectionViewDelegate,UICollectionViewDataSource {
var mySearchController : UISearchController!
var mySearchBar : UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
let src = SearchResultsController(data: convertObjectsToArray())
// instantiate a search controller and keep it alive
mySearchController = UISearchController(searchResultsController: src)
mySearchController.searchResultsUpdater = src
mySearchBar = mySearchController.searchBar
//set delegates
mySearchBar.delegate = self
mySearchController.delegate = self
}
Dies ist die Datenfunktion ist für die
func convertObjectsToArray() -> [String] {
//open realm and map al the objects
let realm = try! Realm()
let getAutoCompleteItems = realm.objects(AutoComplete).map({$0})
...
return convertArrayStrings // returns [String] with all words
}
So UISearchController
verwendet, wenn der Benutzer drückte den Suchknopf auf der Tastatur, ich speichere dieses Wort in meiner Datenbank.
Jetzt muss ich die aktualisierte Version von convertObjectsToArray()
in meinem searchResultsController
setzen, aber ich habe nicht herausgefunden, wie dies zu tun ist. Alle Hilfe ist willkommen
Und zuletzt, meine SearchResultsController
Klasse, die in der ViewDidLoad meiner Overview.swift
Klasse verwendet wird.
class SearchResultsController : UITableViewController {
var originalData : [String]
var filteredData = [String]()
init(data:[String]) {
self.originalData = data
super.init(nibName: nil, bundle: nil)
}
required init(coder: NSCoder) {
fatalError("NSCoding not supported")
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.filteredData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
cell.textLabel!.text = self.filteredData[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
clickedInfo = filteredData[indexPath.row]
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
}
Für die Filterung meiner Worte in der Tableview (wenn Benutzertypen etwas, sind nur passende Strings dargestellt), verwende ich die folgende Erweiterung.
extension SearchResultsController : UISearchResultsUpdating {
func updateSearchResultsForSearchController(searchController: UISearchController) {
let sb = searchController.searchBar
let target = sb.text!
self.filteredData = self.originalData.filter {
s in
let options = NSStringCompareOptions.CaseInsensitiveSearch
let found = s.rangeOfString(target, options: options)
return (found != nil)
}
self.tableView.reloadData()
}
Ich verwende die Funktion bereits als Erweiterung, und das meine Daten nicht auf die anderen von einer Klasse geben, Recht? – SoundShock