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 UISearchDisplayDelegate
searchDisplayController: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.
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). –
@JamesWeir sprawdź moją zaktualizowaną odpowiedź. –
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. –