Для этого есть стандартный компонент, называемый UISearchDisplayController ,
Он дает вам UISearchBar
и UITableView
для отображения результатов.
Затем вы можете настроить содержимое и внешний вид табличного представления в соответствии с вашими потребностями.
Чтобы получить контроль над действиями, выполняемыми таким контроллером, вам необходимо будет соответствовать UISearchDisplayDelegate .
Я предлагаю вам внимательно изучить пример приложение , вы можете найти в документе.
<Сильный> ИЗМЕНИТЬ
Чтобы реализовать функции автозаполнения, вы можете реализовать метод searchDisplayController: shouldReloadTableForSearchString
протокола UISearchDisplayDelegate
. Он будет вызываться у каждого символа, введенного пользователем.
Предполагая, что у вас есть свойство CLGeocoder
, называемое geocoder
, и что вы держите метки в свойстве NSArray
, называемом placemarks
, вот пример того, как вы можете достичь живого автозаполнения:
-(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;
}
Каждый раз, когда строка ввода для поиска изменяется, вы выполняете геокодирование вперед с использованием такой строки. В блоке completeHandler
вы назначаете вновь найденные метки методу метки
и перезагружаете таблицу.
Пожалуйста, не делайте этого, так как поиск асинхронный, вы позаботитесь о перезагрузке таблицы в обработчике завершения и возвращаете НЕТ в методе делегата. Возврат YES приведет к перезагрузке таблицы до завершения поиска, что не является поведением, которое вы хотите.
В качестве заключительного замечания помните, что предоставленный мной код минимален. В реальном приложении вам лучше позаботиться об ошибках, с которыми может столкнуться геокодер, например kCLErrorGeocodeFoundNoResult
, kCLErrorGeocodeFoundPartialResult
и kCLErrorGeocodeCanceled
, документация здесь .