2016-06-13 7 views
0

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

Antwort

0

können Sie die Update-Funktion des Suchsteuerung verwenden für das denke ich:

func updateSearchResultsForSearchController(searchController: UISearchController) { 

    convertObjectsToArray() 
    self.tableView.reloadData() 


} 
+0

Ich verwende die Funktion bereits als Erweiterung, und das meine Daten nicht auf die anderen von einer Klasse geben, Recht? – SoundShock

Verwandte Themen