Как сделать - автозаполнение поиска глобальный, а не локальный
Я использую следующий код:
class SearchViewController: UIViewController {
var searchCompleter = MKLocalSearchCompleter()
var searchResults = [MKLocalSearchCompletion]()
@IBOutlet weak var searchResultsTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
searchCompleter.delegate = self
}
}
extension SearchViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchCompleter.queryFragment = searchText
}
}
extension SearchViewController: MKLocalSearchCompleterDelegate {
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
searchResults = completer.results
searchResultsTableView.reloadData()
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
// handle error
}
}
extension SearchViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let searchResult = searchResults[indexPath.row]
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
cell.textLabel?.text = searchResult.title
cell.detailTextLabel?.text = searchResult.subtitle
return cell
}
}
extension SearchViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let completion = searchResults[indexPath.row]
let searchRequest = MKLocalSearchRequest(completion: completion)
let search = MKLocalSearch(request: searchRequest)
search.start { (response, error) in
let coordinate = response?.mapItems[0].placemark.coordinate
print(String(describing: coordinate))
}
}
}
Однако это ищет только локальный, а не глобальный. Как сделать автозаполнение поиска по глобальным данным? Я не могу получить, если есть API для iOS для того же и как этого добиться. Помощь очень ценится.
2 ответа
Я не эксперт по MapKit
, но после прочтения документации мне кажется, что вы можете указать регион поиска, установив region
параметр в MKLocalSearchRequest
, Приведенный ниже код является примером в официальных документах.
При указании поисковых строк включите регион карты, чтобы сузить результаты поиска до указанной географической области.
let request = MKLocalSearchRequest() request.naturalLanguageQuery = "coffee" // Set the region to an associated map view's region request.region = myMapView.region
myMapView.region
это видимая область в вашем MKMapView
, Так что, если вы получаете локальные результаты, это, вероятно, потому что ваша карта увеличена в этой области.
Но если вы показываете результаты за пределами видимой области на карте, то это выглядит как плохой UX, потому что пользователь ожидает результатов в области, которая видна ему. Проверьте, что сделали текущие приложения карты. Они показывают результаты, которые сначала находятся в видимой области, а затем в других областях. Кажется, это из-за того, что они говорят в последней строке документации.
Указание региона не гарантирует, что результаты будут все внутри региона. Это просто подсказка поисковой системе.
У меня была такая же проблема, и я обнаружил, что
MKLocalSearch.Request
( https://developer.apple.com/documentation/mapkit/mklocalsearch/request ) работает лучше для глобального поиска, чем
MKLocalSearchCompletion
. Вам просто нужно сделать регион регионом по умолчанию, который, согласно Apple, является глобальным (https://developer.apple.com/documentation/mapkit/mklocalsearchcompleter/1451923-region):
Используйте это свойство, чтобы ограничить результаты поиска указанной географической областью. Значением по умолчанию этого свойства является регион, охватывающий весь мир.
Что можно сделать следующим образом:
let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion()
request.naturalLanguageQuery = query
let search = MKLocalSearch(request: request)
search.start { response, error in
guard let response = response else {
return
}
self.predictions = response.mapItems
}