2017-05-16 4 views
0

Ich versuche, eine Suchleiste für eine TableView zu implementieren, und ich erhalte den Fehler "... Binary Operator '==' kann nicht auf Operanden vom Typ 'Place' und 'String'" in meinem TextDidChange angewendet werden Methode. Die TabelleView wird aus einem "placeList" -Array der Firebase-Datenbank gefüllt. Nicht sicher, woher die Fehlerquelle kommt. Vielen Dank im Voraus für jede Hilfe!searchbar textDidChange Fehler

lazy var searchBar:UISearchBar = UISearchBar() 

var placeList = [Place]() 
var placesDictionary = [String: Place]() 

var isSearching = false 
var filteredData = [Place]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchBar.searchBarStyle = UISearchBarStyle.prominent 
    searchBar.placeholder = " Search Places..." 
    searchBar.sizeToFit() 
    searchBar.isTranslucent = false 
    searchBar.backgroundImage = UIImage() 
    searchBar.delegate = self 
    searchBar.returnKeyType = UIReturnKeyType.done 
    navigationItem.titleView = searchBar 

    tableView.allowsMultipleSelectionDuringEditing = true 

} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId) 

    if isSearching { 
     cell.textLabel?.text = filteredData[indexPath.row].place 
    } else { 

    cell.textLabel?.text = placeList[indexPath.row].place 

    } 
    return cell 
} 

func SearchBar (_ SearchBar: UISearchBar, textDidChange search: String) {

if searchBar.text == nil || searchBar.text == "" { 
     isSearching = false 
     view.endEditing(true) 
     tableView.reloadData() 
    } else { 
     isSearching = true 
     // error in below line of code... 
     filteredData = placeList.filter({$0.place == searchBar.text}) 
     tableView.reloadData() 
    } 

} 

Antwort

1

Ihr Eigentum placeList ist ein Array von Place Objekten. Wenn Sie die filter Funktion auf Ihrem Array aufrufen (placeList.filter({$0 == searchBar.text!})), was Sie sagen, ist "filter placeList, wo ein Place-Objekt gleich searchBar.text ist". Ein Ortsobjekt ist kein String, Sie können zwei verschiedene Typen nicht vergleichen. Ich bin nicht mit Ihrem Datenmodell oder Ihrer Place Klasse vertraut, aber vielleicht haben Sie eine Art String-Eigenschaft in Ihrer Place Klasse, mit der Sie vergleichen können? Zum Beispiel, sagen Place hatte eine Eigenschaft namens id des Typs String, können Sie dann durch Vergleich wie folgt filtern: filteredData = placeList.filter({$0.id == searchBar.text!}) - beachten Sie die hinzugefügt $0.id.

Sie nur einen String in einen String vergleichen

+0

Dank, die Sinn macht ... Ich habe ein Modell „Place“ NSObject mit String Value „Ort“ zu tun, und meine Feuerbasis Datenmodell hat einen Abkömmling-Wert-Titel " platzieren "auch. Also habe ich filteredData = placeList.filter ({$ 0.place == searchBar.text}) aktualisiert, aber immer noch kein Glück ...? Es stürzt nicht ab oder gibt mir einen Fehler, wenn ich die Anwendung ausführe - aber gibt gefilterte Ergebnisse nicht an searchBar textChange zurück. – user3708224

+0

@ user3708224 - so wie der Code geschrieben wird, wird er nur Objekte filtern, wo die 'place' Zeichenkette genau mit Ihrer' searchBar.text' übereinstimmt. Sie könnten versuchen, beide Strings in Kleinbuchstaben zu schreiben, um jegliche Art von Groß- und Kleinschreibung zu vermeiden. Sie könnten dies versuchen: 'placeList.filter ({$ 0.place.lowercased() == searchBar.text.lowercased()})'. Wenn das immer noch nicht funktioniert, würde es mich glauben machen, dass keines deiner 'Place'-Objekte in Firebase eine' place'-Zeichenfolge hat, die deinem Suchtext entspricht. – Pierce

+0

@ user3708224- Auch wenn Sie nur nach 'place'-Strings filtern möchten, die nur den Text in Ihrer Suche enthalten (aber nicht genau gleich), können Sie die 'contains'-Funktion für Swifts String-API verwenden, die aussehen würde etwa so: 'placeList.filter ({$ 0.place.lowercased(). contains (searchBar.text.lowercased())})' – Pierce

Verwandte Themen