MapKit SearchResultsUpdating Не вызывается

Может кто-нибудь пересмотреть мой код? Я пытаюсь использовать 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 ответ

Решение

Мы пытаемся сделать searchController работать в первую очередь.

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

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

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

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

Другие вопросы по тегам