2017-07-07 3 views
1

Ich habe eine Tabellenansicht und eine Suchleiste hinzugefügt (programmgesteuert). Ich möchte die gefilterten Ergebnisse zeigen, also habe ich ein Array (namens todoTitle) erstellt, das Titel für meine todo-Aktivitäten enthält (ich habe ein separates Objekt für sie und eine seiner Eigenschaften ist title). Ich benutze updateSearchResults-Methode und innerhalb davon benutze ich eine Filtermethode, um richtige Todos zurückzugeben. Um zu überprüfen, dass die Arrays nicht leer sind, schreibe ich Code innerhalb dieser Funktion, um die Todos innerhalb jedes Arrays zu drucken. Hier ist mein Code innerhalb von updateSearchResults (für :) FunktionKann mir jemand sagen, warum mein gefiltertes Array leer ist?

//filtering through todos' titles 
    filteredTodos = self.todosTitle.filter({ (title: String) -> Bool in 
     if title.lowercased().contains((self.searchController.searchBar.text?.lowercased())!) { 
      return true 
     } else { 
      print ("S \(todosTitle)") 
      print ("t \(title)") 
      print (filteredTodos) 

      return false 

     } 
    }) 
    //updating the results TableView 
    self.resultsController.tableView.reloadData() 

} 

``

todosTitle Array nicht leer ist, so dass ich nicht verstehen, warum meine filteredTodos leer. Hat jemand irgendwelche Ideen, warum das passieren könnte?

+1

Drucken des Ergebnisarray 'filteredTodos' * innerhalb des Verschlusses * nicht viel Sinn machen. –

+0

sollten Sie self.searchController.searchBar.text drucken? um zu trösten und zu überprüfen. Es wird sonst blockieren, das könnte der Grund sein. – adev

+0

'filteredodos' wird nicht mit dem Ergebnis des Filters gesetzt, bis der Filter zurückkehrt. nur um klar zu sein – PeejWeej

Antwort

0

Sie müssen nur prüfen, ob der Titel des Aufgabenobjekts den Suchtext enthält. Hier ist ein vereinfachtes Beispiel, das ich mit einem Array von Strings und einer Suchtextfolge getestet habe. Vielleicht ist Ihre Zuordnung der Suchtext trennen, um sicherzustellen, werden Sie die Zeichenfolge bekommen Sie von der searchBar.text erwarten

let todosTitle = ["One", "Two", "Three"] 
let searchText = "t" 

//filtering through todos' titles 
let filteredTodos = todosTitle.filter({ (title: String) -> Bool in 
    return title.lowercased().contains(searchText.lowercased()) 
}) 

print(filteredTodos) //["Two", "Three"] 
+0

Ich mache das gleiche, aber anstelle einer literalen Zeichenfolge verwende ich Text aus der searchBar. Ich habe überprüft, und in der Methode oben ist mein todosTitle-Array nicht leer, also ist der andere Teil meines Codes, dem ich einige Werte hinzufüge, einfach ok (denke ich). Das Problem ist, dass ich nicht verstehe, warum die Filtermethode nicht sieht, dass mein todosTitle-Array nicht leer ist (die print() - Funktion in der obigen Methode druckt alle Objekte, die das Array enthält). – Tigran

+0

Auch wenn ich "title" -Eigenschaft von meiner Schließung drucke, druckt es alle Elemente im todosTitle-Array, so dass es nicht leer ist. – Tigran

+1

Das gefilterte Array wird erst nach Abschluss des Abschlusses zugewiesen. – myuiviews

Verwandte Themen