2016-04-08 8 views
0

Übersicht: Ich versuche, eine Suchleiste zu suchen, um nach verschiedenen Eigenschaften basierend auf dem eingegebenen Text zu suchen. Zum Beispiel, wenn ich ein Adressbuch mit 'Namen' und 'Zahlen' habe, möchte ich eine Zeichenfolge in der Suchleiste, um 'Namen' zu suchen und wenn ein Int in der Suchleiste eingegeben wird, um 'Nummern' zu suchen. (Genau wie das Telefon App iPhone)Suche nach mehreren Eigenschaften mit RealmSearchViewController

Schritte unternommen:

1) Ich habe die RealmSearchViewController a la Realm Tutorial umgesetzt. (https://realm.io/news/building-an-ios-search-controller-in-swift/)

2) Ich habe herausgefunden, wie die searchPropertyKeyPath-Eigenschaft über die Initialisierung zuweisen. (Siehe unten, wenn es jemand hilft)

erforderlich init (Coder aDecoder: NSCoder) { super.init (Coder: aDecoder) self.searchPropertyKeyPath = "Phone" print ("Hallo") Druck ("Searchbar:" self.searchBar.text) }

Problem: kann ich nicht geklappt, wie man a) Scan searchbar.text [zu überprüfen, ob es int oder String ist] und dann b) modifiziere den searchPropertyKeyPath [um die entsprechende Eigenschaft zu suchen].

Irgendwelche Ansichten darüber, wie man das macht?

(Meine Vermutung wäre, die Funktion refreshSearchResults() aus der RealmSwiftViewController-Datei zu überschreiben und dann zu modifizieren. Und ja, ich habe das versucht, bin aber auf Coding-Probleme gestoßen, die ich in dieser Frage nicht hervorheben wollte)

+0

Ich konnte keine Lösung dafür finden, ohne das Repository zu fälschen und die NSPredate-Funktionen wie gewünscht zu schreiben. – bcamur

Antwort

0

Sie denen danken, die geantwortet, war meine Lösung nicht die RealmSearchViewController verwenden und stattdessen Realm Prädikate mit Xcode UISearchController a la diesem Tutorial zu verwenden: https://www.raywenderlich.com/113772/uisearchcontroller-tutorial.

+0

Ich bin auch mit diesem Problem konfrontiert, können Sie mir zeigen, wie Sie die Suche nach mehreren Werten gelöst haben? – MkaysWork

1

Realm NSPredicate für die Abfrage verwendet, und NSPredicate ermöglicht auf einfache Weise mehrere Eigenschaften mit Hilfe NSCompoundPredicate Abfrage auf:

class Person: Object { 
    dynamic var name = "John" 
    dynamic var phoneNumber = "1-800-DINOSAUR" 
} 
let searchString = "John" 
let subpredicates = ["name", "phoneNumber"].map { property in 
    NSPredicate(format: "%K CONTAINS %@", property, searchString) 
} 
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: subpredicates) 
let johnInNameOrNumber = realm.objects(Person).filter(predicate) 

um mehr über NSPredicate Syntax zu lernen, sollten Sie auf Realm's NSPredicate Cheatsheet verweisen.

0

Meine Antwort ist eine Art Workaround, aber es sollte gut funktionieren. Sie erstellen eine Eigenschaft, die alle Informationen enthält, die Sie möglicherweise durchsuchen möchten, und haben dann die Sucheigenschaft.

Angenommen, Ihre Kontakte werden aus einer CSV erstellt und Sie haben diese CSV-Informationen irgendwie in eine Struktur übernommen. Der Einfachheit halber verlasse ich jeden Bezug auf das Reich.

class Contact: Object { 
    var name = "" 
    var number = 0 
    var fullInfo = "" 
} 

struct ContactInfo { 
    var name: String 
    var number: Int 
} 

func createContact(from info: ContactInfo) { 
    var newContact = Contact() // your Object subclass 
    newContact.name = info.name 
    newContact.number = info.number 
    newContact.fullInfo = "\(info.name) - \(String(info.number))" 
} 

Dann setzen Sie Ihre searchProperty zu fullInfo.

Beachten Sie, dass, obwohl es verlockend ist, fullInfo eine berechnete Eigenschaft zu machen, dies nicht funktioniert, weil Sie keine berechnete Eigenschaft für eine searchProperty haben können.

Verwandte Themen