MapKit SearchResultsUpdating Не вызывается - PullRequest
0 голосов
/ 21 февраля 2019

Может кто-нибудь пересмотреть мой код?Я пытаюсь использовать MapKit для получения локальных результатов поиска.Я использовал этот урок: https://www.thorntech.com/2016/01/how-to-search-for-location-using-apples-mapkit/

Отличия от урока и то, что я делаю, заключается в том, что я не хочу отображать mapView.Я просто хочу нажать на кнопку, и поисковый контроллер начинает работать, что позволяет мне искать местоположения.Проблема у меня в том, что SearchResultsUpdating не вызывается.Извините за длинный код, я впервые использую локальный поиск MapKit, и я не знаю, что мне не хватает.

* РЕДАКТИРОВАТЬ Это исправлено.Прилагается пересмотренный код.

import UIKit
import MapKit
import CoreLocation

class LocationSearchTable: UITableViewController {
let cellId = "cellId"
var searchController = UISearchController(searchResultsController: nil)

var matchingItems: [MKMapItem] = []
let mapView = MKMapView()
let locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()

    setupLocationManager()
    setupSearchBar()
    setupMapView()

    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
    navigationController?.isNavigationBarHidden = false
    navigationItem.hidesSearchBarWhenScrolling = false
}

fileprivate func setupLocationManager() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestWhenInUseAuthorization()
    locationManager.requestLocation()
}

fileprivate func setupSearchBar() {
    let searchBar = searchController.searchBar
    searchBar.placeholder = "Enter Location"
    navigationItem.searchController = searchController
    searchController.searchResultsUpdater = self
    definesPresentationContext = true
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
    let selectedItem = matchingItems[indexPath.row].placemark
    cell.textLabel?.text = selectedItem.name
    cell.detailTextLabel?.text = ""
    return cell
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return matchingItems.count
}
}

extension LocationSearchTable: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        locationManager.requestLocation()
    }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.first {
        let span = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
        let region = MKCoordinateRegion(center: location.coordinate, span: span)
        mapView.setRegion(region, animated: true)
        print("location: \(location)")
    }
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print(error)
}
}

extension LocationSearchTable: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
    if let searchText = searchController.searchBar.text {
        let request = MKLocalSearch.Request()
        request.naturalLanguageQuery = searchText
        request.region = mapView.region

        let search = MKLocalSearch(request: request)
        search.start { (response, _) in
            guard let response = response else { return }
            self.matchingItems = response.mapItems
            self.tableView.reloadData()
        }
    }
}
}    

1 Ответ

0 голосов
/ 21 февраля 2019

Сначала мы пытаемся заставить searchController работать.

Следуйте этому при настройке searchController

  1. Объявите контроллер поиска, у вас это есть.let searchController = UISearchController(searchResultsController: nil)
  2. In viewDidLoad()
navigationItem.searchController = searchController
searchController.searchResultsUpdater = self
definesPresentationContext = true
Настройте обновление текста контроллера поиска, убедитесь, что ваш контроллер соответствует UISearchResultsUpdating протоколу
extension LocationSearchTable: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        if let searchText = searchController.searchBar.text {
            print(searchText)
        }
    }
}

Когда мы используем UISearchController, нам не нужна настройка searchBar.

Комментарий ниже, дайте мне знать, текст поиска может быть распечатан или нет.Тогда мы можем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...