Наложение результатов поиска местоположения

Я пытаюсь добавить панель поиска в одно из моих приложений, которое позволяет пользователю вводить адресную информацию, и появляется табличное представление с возможными результатами (и клавиатурой). По сути, те же функции, что и в приложении «Карты». Есть простой способ сделать это?

enter image description here

It would be nice to have a Current Location default & autocomplete as well, but not necessary. I can build the UI from scratch, but I don't know how to get back the search results. Can I use geocoder and parse the results into a tableview?

7
добавлено отредактировано
Просмотры: 1
de

1 ответы

Для этого есть стандартный компонент, называемый 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 , документация здесь .

10
добавлено
@JamesWeir проверить мой обновленный ответ.
добавлено автор Gabriele Petronella, источник
Вы можете рассматривать разные геокодеры. Попробуйте это сделать, и если вы не можете найти что-либо, задайте другой вопрос;)
добавлено автор Gabriele Petronella, источник
не удалось получить пример приложения
добавлено автор Patel Jigar, источник
Это отлично работает для интерфейса пользователя. Любая идея по второй части моего вопроса, результаты поиска? Я хочу, чтобы можно было набирать текст в UISearchBar и отображать возможные местоположения в таблице (я предполагаю использовать Apple Maps).
добавлено автор James Weir, источник
Хорошо, все работает сейчас, но результаты не то, на что я надеялся. CLGeocoder не дает наибольших результатов. Например, поиск «Яблока», как я сделал на скриншоте выше, дает только 2 удара по адресу улицы. Глядя на документы Apple, они отмечают, что для поиска своего HQ с использованием CLGeocoder вам нужно будет искать «1 бесконечную петлю, Купертино, Калифорния». Невозможно получить такие результаты поиска, которые использует приложение «Карты» (например, на картинке выше). Целью было упростить поиск местоположения для пользователя - не требовать точной информации о адресе.
добавлено автор James Weir, источник
Спасибо за помощь. Отметив это как разрешенное, так как он ответил на то, что я пытался сделать.
добавлено автор James Weir, источник