2016-04-15 5 views
1

Mein aktuellen Code zu füllen eine Tableview mit Adressen aus dem Google Places API-Endpunkt ist wie folgt:Versuch GMSPlacesClient zu replizieren: autoCompleteQuery Funktion zum Auffüllen eines UITableView manuell

Allerdings mag ich das eine benutzerdefinierte Client erstellen zu handhaben Funktionalität, die AutoCompleteQuery, von Places zur Verfügung gestellt, kümmert sich aber manuell. Ich nehme an, dass dies fordert, dass die Adresse JSON erneut geparst wird, und durchlaufen wird, dann in einem Array gespeichert wird. Bitte lassen Sie mich wissen, wenn Sie eine Lösung haben. Der kommentierte Code funktioniert einwandfrei, ich versuche das gleiche Ergebnis manuell zu erreichen.

func searchBar(searchBar: UISearchBar, textDidChange searchText: String){ 

//  let mapsClient = GMSPlacesClient() 
//  mapsClient.autocompleteQuery(searchText, bounds: nil, filter: nil {(results, error: NSError?) in 
//    
//   self.resultsArray.removeAll() 
//    
//   if results == nil{ 
//    return 
//   } 
//    
//   for result in results! { 
//    
//    if let result = result as GMSAutocompletePrediction! { 
//     self.resultsArray.append(result.attributedFullText.string) 
//    } 
//   } 
//    
//   self.searchResultsClient.reloadDataWithArray(self.resultsArray) 
//  } 

    gmsFetcher?.sourceTextHasChanged(searchText) 

    self.searchResultsClient.reloadDataWithArray(self.resultsArray) 
    print(resultsArray) 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
} 

extension MainMapViewController: GMSAutocompleteFetcherDelegate { 
func didAutocompleteWithPredictions(predictions: [GMSAutocompletePrediction]) { 

    self.resultsArray.count + 1 

    let resultsStr = NSMutableString() 
    for prediction in predictions { 
     resultsStr.appendFormat("%@\n", prediction.attributedPrimaryText) 
    } 

    resultText?.text = resultsStr as String 
    self.resultsArray.append(resultsStr as String) 
    self.searchResultsClient.reloadDataWithArray(self.resultsArray) 
} 
    func didFailAutocompleteWithError(error: NSError) { 
     resultText?.text = error.localizedDescription 
    } 
} 

Antwort

2

können Sie verwenden GMSAutocompleteFetcher, die die autocompleteQuery Methode auf GMSPlacesClient wickelt. Der Fetcher drosselt Anforderungen, gibt nur Ergebnisse für den zuletzt eingegebenen Suchtext zurück und stellt keine UI-Elemente bereit.

Schritte GMSAutocompleteFetcher implementieren:

  1. Umsetzung des GMSAutocompleteFetcherDelegate Protokoll.
  2. Erstellen Sie ein Objekt GMSAutocompleteFetcher.
  3. Rufen Sie sourceTextHasChanged auf dem Fetcher, wie der Benutzer eingibt.
  4. Behandeln Sie Vorhersagen und Fehler unter Verwendung der Protokollmethoden didAutcompleteWithPredictions und didFailAutocompleteWithError.

Beispielcode die Umsetzungsschritte bei der Verwendung der Abholer demonstrieren können in Use the fetcher finden.

+0

Danke für die Antwort, die mich näher bringt. Allerdings muss ich noch Ergebnisse an eine TableView anhängen und es gibt keine Ressourcen genau, wie dies getan wird. Irgendwelche Ideen? –

0

Gelöst: So habe ich das Problem der Aktualisierung von UITableView-Zeilen mit Autocomplete gelöst, wenn Text von einer UISearchBar aktualisiert wurde.

func searchBar(searchBar: UISearchBar, textDidChange searchText: String){ 

    self.resultsArray.removeAll() 
    gmsFetcher?.sourceTextHasChanged(searchText) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 
} 

//Implement GMSAutoCompleteFetcherDelegate protocol to handle custom string prediction 
extension MainMapViewController: GMSAutocompleteFetcherDelegate { 
    func didAutocompleteWithPredictions(predictions: [GMSAutocompletePrediction]) { 

    for prediction in predictions { 

     if let prediction = prediction as GMSAutocompletePrediction!{ 
     self.resultsArray.append(prediction.attributedFullText.string) 
     } 
    } 

    self.searchResultsTable.reloadDataWithArray(self.resultsArray) 
    print(resultsArray) 
    } 
    func didFailAutocompleteWithError(error: NSError) { 
     resultText?.text = error.localizedDescription 
    } 
}