2012-12-28 15 views
7

Sto tentando di aggiungere una barra di ricerca a una delle mie app che consente a un utente di immettere le informazioni sull'indirizzo e viene visualizzata una tabella con i possibili risultati (e una tastiera). Sostanzialmente la stessa funzionalità fornita nell'app Maps. C'è un modo semplice per farlo?Posizione Cerca risultati overlay

enter image description here

Sarebbe bello avere un attuale posizione predefinita & autocomplete pure, ma non necessario. Posso creare l'interfaccia grafica da zero, ma non so come recuperare i risultati della ricerca. Posso usare geocoder e analizzare i risultati in una tabella?

risposta

10

C'è un componente standard per farlo, chiamato UISearchDisplayController.

Ti dà un UISearchBar e un UITableView per la visualizzazione dei risultati. Quindi è possibile personalizzare il contenuto e l'aspetto della vista tabella in base alle proprie esigenze.

Per ottenere il controllo delle azioni eseguite da tale controller, è necessario conformarsi al protocollo UISearchDisplayDelegate.

Ti suggerisco di guardare attentamente lo example app che trovi sul documento.

EDIT

Al fine di implementare le funzionalità completamento automatico è possibile implementare il metodo del protocollo UISearchDisplayDelegatesearchDisplayController:shouldReloadTableForSearchString. Sarà chiamato ad ogni carattere digitato dall'utente.

Supponendo di avere una proprietà CLGeocoder chiamato geocoder e che si stanno tenendo i segnaposto in un NSArray proprietà chiamata placemarks, ecco un esempio di come è possibile ottenere un completamento automatico dal vivo:

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {  
    [self.geocoder geocodeAddressString:searchString completionHandler:^(NSArray *placemarks, NSError *error) { 
      self.placemarks = placemarks; 
      [self.searchDisplayController.searchResultsTableView reloadData]; 
    }]; 
    return NO; 
} 

Ogni stringa di input per la modifica della ricerca, si esegue una geocodifica in avanti utilizzando tale stringa. Nel blocco completionHandler si assegnano i segnaposto appena trovati alla proprietà placemarks e si ricarica la tabella.

Si prega di notare che poiché la ricerca è asincrona, si prenderà cura di ricaricare la tabella nel gestore di completamento e di restituire NO nel metodo delegato. Il ritorno di YES farà ricaricare la tabella prima che la ricerca sia terminata, il che non è il comportamento che desideri.

Come ultima osservazione, ricordare che il codice che ho fornito è minimo. In un'app per il mondo reale è preferibile occuparsi degli errori in cui potrebbe incorrere il geocoder, ad esempio kCLErrorGeocodeFoundNoResult, kCLErrorGeocodeFoundPartialResult e kCLErrorGeocodeCanceled, documentato here.

+0

Questo funziona benissimo per il lato UI delle cose. Qualche idea sulla seconda parte della mia domanda, i risultati della ricerca? Voglio essere in grado di iniziare a digitare in UISearchBar e visualizzare le possibili posizioni nella tabella (presumo che utilizzi Apple Maps). –

+0

@JamesWeir controlla la mia risposta aggiornata. –

+0

Ok, tutto funziona ora, ma i risultati non sono quello che speravo. CLGeocoder non dà il massimo dei risultati. Ad esempio, la ricerca di "Apple" come ho fatto nella schermata sopra produce solo 2 risultati in base all'indirizzo. Guardando i documenti Apple si dice che per trovare il proprio HQ usando CLGeocoder si dovrebbe cercare "1 Infinite Loop, Cupertino, CA".Non c'è modo di ottenere il tipo di risultati di ricerca che l'app di Maps crea (come nella foto sopra). L'obiettivo era quello di rendere la ricerca della posizione facile per l'utente, non di richiedere informazioni precise sull'indirizzo. –