gpt4 book ai didi

swift - MapKit SearchResultsUpdating 未调用

转载 作者:行者123 更新时间:2023-11-30 10:50:03 24 4
gpt4 key购买 nike

有人可以审查我的代码吗?我正在尝试使用 MapKit 获取本地搜索结果。我使用了这个教程:https://www.thorntech.com/2016/01/how-to-search-for-location-using-apples-mapkit/

与教程和我正在做的事情的区别在于我不想显示 map View 。我只想单击按钮,然后会弹出一个 searchController,让我可以搜索位置。我遇到的问题是 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()
}
}
}
}

最佳答案

我们首先尝试让 searchController 工作。

按照此设置 searchController

  1. 声明搜索 Controller ,你已经得到了这个。让 searchController = UISearchController(searchResultsController: nil)
  2. viewDidLoad()
navigationItem.searchController = searchController
searchController.searchResultsUpdater = self
definesPresentationContext = true
  • 设置搜索 Controller 文本更新,确保您的 Controller 符合 UISearchResultsUpdating 协议(protocol)
  • extension LocationSearchTable: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
    if let searchText = searchController.searchBar.text {
    print(searchText)
    }
    }
    }
    <小时/>

    当我们使用UISearchController时,我们不需要设置searchBar

    下面的评论让我知道搜索文本是否可以打印出来。然后我们就可以继续了。

    关于swift - MapKit SearchResultsUpdating 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797378/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com