Как сделать - автозаполнение поиска глобальный, а не локальный - PullRequest
0 голосов
/ 08 октября 2018

Я использую следующий код:

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 для того же и как этого добиться.Помощь очень ценится.

Я получаю это: enter image description here хотя мне нужно это: enter image description here

1 Ответ

0 голосов
/ 08 октября 2018

Я не эксперт по 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.Так что, если вы получаете локальные результаты, это, вероятно, потому, что ваша карта увеличена в этой области.

Но если вы показываете результаты за пределами видимой области на карте, то это выглядит как bad UX , потому что пользователь ожидает результатов в области, которая видна ему.Проверьте, что сделали текущие приложения карты.Они показывают результаты, которые сначала находятся в видимой области, а затем в других областях.Похоже, это связано с тем, что говорится в последней строке документации.

Указание региона не гарантирует, что все результаты будут находиться внутри региона.Это просто подсказка поисковой системе.

...