2012-12-28 17 views
7

Próbuję dodać pasek wyszukiwania do jednej z moich aplikacji, która pozwala użytkownikowi wprowadzić informacje adresowe, a widok tabeli zawiera możliwe wyniki (i klawiaturę). Zasadniczo ta sama funkcjonalność dostępna w aplikacji Mapy. Czy istnieje prosty sposób na zrobienie tego?Nakładka wyników wyszukiwania lokalizacji

enter image description here

Byłoby miło mieć Aktualna lokalizacja domyślna & autouzupełniania, jak również, ale nie jest to konieczne. Mogę zbudować interfejs od zera, ale nie wiem, jak odzyskać wyniki wyszukiwania. Czy mogę użyć geokodera i przeanalizować wyniki w widoku tabeli?

Odpowiedz

10

Istnieje standardowy komponent do robienia tego, o nazwie UISearchDisplayController.

To daje UISearchBar i UITableView do wyświetlania wyników. Następnie można dostosować zawartość i wygląd widoku tabeli do swoich potrzeb.

Aby uzyskać kontrolę nad działaniami wykonywanymi przez taki kontroler, należy zastosować się do protokołu UISearchDisplayDelegate.

Proponuję, aby uważnie przyjrzeć się example app można znaleźć na dokumencie.

EDIT

W celu realizacji funkcji autouzupełniania można zaimplementować metodę protokołu UISearchDisplayDelegatesearchDisplayController:shouldReloadTableForSearchString. Będzie on wywoływany przy każdym znaku wpisanym przez użytkownika.

Zakładając, że masz nieruchomość CLGeocoder nazywa geocoder i że trzymają oznaczenia miejsc do własności NSArray zwanego placemarks, oto przykład jak można osiągnąć na żywo autouzupełnianie:

-(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; 
} 

Everytime ciąg wejściowy w przypadku zmiany wyszukiwania wykonujesz geokodowanie z wyprzedzeniem, używając takiego ciągu. W bloku completionHandler możesz przypisać nowo znalezione oznaczenia miejsc do swojej właściwości placemarks i ponownie załadować tabelę.

Proszę zauważyć, że ponieważ wyszukiwanie jest asynchroniczne, zajmiesz się przeładowaniem tabeli w procedurze uzupełniania i zwrócisz NO w metodzie delegatów. Zwrócenie YES spowoduje przeładowanie stołu przed zakończeniem wyszukiwania, co nie jest pożądanym zachowaniem.

Jako uwaga końcowa, pamiętaj, że podany przeze mnie kod jest minimalny. W rzeczywistej aplikacji lepiej zadbaj o błędy, na które może natknąć się geocoder, takie jak kCLErrorGeocodeFoundNoResult, kCLErrorGeocodeFoundPartialResult i kCLErrorGeocodeCanceled, udokumentowane here.

+0

To działa świetnie dla strony interfejsu użytkownika. Masz pomysł na drugą część mojego pytania, wyniki wyszukiwania? Chcę móc zacząć pisać w UISearchBar i mieć możliwe lokalizacje pokazane w tabeli (zakładam, że korzystam z Apple Maps). –

+0

@JamesWeir sprawdź moją zaktualizowaną odpowiedź. –

+0

OK, wszystko działa teraz, ale wyniki nie są tym, na co liczyłem. CLGeocoder nie daje największych rezultatów. Na przykład wyszukanie "Apple", tak jak zrobiłem to na powyższym zrzucie ekranu, daje tylko 2 trafienia w oparciu o adres ulicy. Patrząc na dokumenty Apple wspominają o tym, że aby znaleźć swoje HQ za pomocą CLGeocoder, musielibyśmy wyszukać "1 Infinite Loop, Cupertino, CA".Czy nie ma sposobu na uzyskanie wyników wyszukiwania w aplikacji Mapy (jak na powyższym obrazku). Chodziło o to, aby wyszukiwanie lokalizacji było łatwe dla użytkownika - nie wymagało dokładnych informacji adresowych. –

Powiązane problemy