ios - Swift Mapkit 自动搜索业务

标签 ios swift mapkit

我正在尝试使用 Mapkit 在我的应用程序中创建自动搜索。我希望 viewcontroller 找到当前位置和他们所在地区的所有酒店。 我已经能够获取当前位置,但找不到任何有关从字符串进行自动搜索的教程。这是我目前所拥有的:

import UIKit
import MapKit
import CoreLocation

class MapClass: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate {
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        let location = locations.last as! CLLocation

        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

        self.mapView.setRegion(region, animated: true)

        locationManager.stopUpdatingLocation()
    }

最佳答案

感谢 Nate Cook 为我指明了正确的方向,我能够使用以下代码解决问题:

import UIKit
import MapKit
import CoreLocation

class MapClass: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate {

var searchController:UISearchController!
var annotation:MKAnnotation!
var localSearchRequest:MKLocalSearchRequest!
var localSearch:MKLocalSearch!
var localSearchResponse:MKLocalSearchResponse!
var error:NSError!
var pointAnnotation:MKPointAnnotation!
var pinAnnotationView:MKPinAnnotationView!


@IBOutlet weak var mapView: MKMapView!
var locationManager: CLLocationManager!

let searchRadius: CLLocationDistance = 2000

override func viewDidLoad() {
    super.viewDidLoad()

    if (CLLocationManager.locationServicesEnabled())
    {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }

}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {

    let location = locations.last as! CLLocation
    let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
    self.mapView.setRegion(region, animated: true)
    var latitude: Double = location.coordinate.latitude
    var longitude: Double = location.coordinate.longitude
    let initialLocation = CLLocation(latitude: latitude, longitude: longitude)
    // 1
    let request = MKLocalSearchRequest()
    request.naturalLanguageQuery = "Restaurant"
    // 2
    let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)

    request.region = MKCoordinateRegion(center: initialLocation.coordinate, span: span)
    // 3
    let search = MKLocalSearch(request: request)
    search.startWithCompletionHandler {
        (response: MKLocalSearchResponse!, error: NSError!) in

        for item in response.mapItems as! [MKMapItem] {
            println(item.name)
            //println("Latitude = \(item.placemark.location.coordinate.latitude)")
            //println("Longitude = \(item.placemark.location.coordinate.longitude)")
            self.addPinToMapView(item.name, latitude: item.placemark.location.coordinate.latitude, longitude: item.placemark.location.coordinate.longitude)
        }
    }

    locationManager.stopUpdatingLocation()

    let coordinateRegion = MKCoordinateRegionMakeWithDistance(initialLocation.coordinate, searchRadius * 2.0, searchRadius * 2.0)
    mapView.setRegion(coordinateRegion, animated: true)

}


func addPinToMapView(title: String, latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
    let location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    let annotation = MyAnnotation(coordinate: location, title: title)

    mapView.addAnnotation(annotation)
}


func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!)
{
    println("Error: " + error.localizedDescription)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

关于ios - Swift Mapkit 自动搜索业务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992213/

相关文章:

javascript - 如何在 UIWebView 加载的 iframe 中注入(inject) javascript - iOS

ios - 无法使用类型为 ( ['NSObject' )、forKey : String) 的参数列表调用 updateValue

ios - 为什么必须将 View 属性分配给变量?

swift - Swift 命令行工具中的多个工作人员

ios - 如何设置可拖动的 map 图钉

ios - 如何在 UITableViewCell 中创建信息按钮?

ios - Firebase 电话身份验证错误 FIRAuthErrorCodeMissingAppToken

ios - 向 SKScene 添加点(如 UIPageViewController 中的点)

ios - UIImage 未在 URLSession 数据任务后加载

ios - Swift 3 - MKPointAnnotation 自定义图像