在 Swift 中使用 MKLocalSearch 将图钉附加到用户位置而不是蓝点
Using MKLocalSearch in Swift attaches a pin to the users location instead of the blue dot
我是编码和 Stack Overflow 的新手,所以如果我做错了什么请原谅我。
我正在使用 MKLocalSearch 来显示由字符串指定的位置。我有一个用户和位置,所以一切都已设置。
我已将 MKLocalSearch 添加到我的应用程序,它工作正常,但现在在用户位置上放置了一个 MKPointAnnotation。当然,我希望出现著名的蓝点而不是注释。
我已经尝试查看代码并查找此问题,但没有找到解决方案。
这是我的 MKLocalSearch 代码:
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = "Dispensaries"
request.region = MapView.region
let search = MKLocalSearch(request: request)
search.start(completionHandler: {(response, error) in
if error != nil {
print("Error occured in search")
} else if response!.mapItems.count == 0 {
print("No matches found")
} else {
print("Matches found")
for item in response!.mapItems {
let annotation = MKPointAnnotation()
annotation.title = item.name
annotation.coordinate = item.placemark.coordinate
DispatchQueue.main.async {
self.MapView.addAnnotation(annotation)
}
print("Name = \(String(describing: item.name))")
print("Phone = \(String(describing: item.phoneNumber))")
print("Website = \(String(describing: item.url))")
}
}
})
这是我的 viewForAnnotation
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
var view = mapView.dequeueReusableAnnotationView(withIdentifier: "reuseIdentifier") as? MKMarkerAnnotationView
if view == nil {
view = MKMarkerAnnotationView(annotation: nil, reuseIdentifier: "reuseIdentifier")`
let identifier = "hold"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
if annotationView == nil {
annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
let btn = UIButton(type: .detailDisclosure)
annotationView?.rightCalloutAccessoryView = btn
} else {
annotationView?.annotation = annotation
}
}
view?.annotation = annotation
view?.displayPriority = .required
return view
}
}
在 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation)
中检查注释类型,例如
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation { return nil }
// the rest of your code
}
如果您使用此方法 return nil
,MKMapView
使用其默认的内置注释视图,对于 MKPointAnnotation
它使用红色图钉,对于 MKUserLocation
你要找的蓝点
我是编码和 Stack Overflow 的新手,所以如果我做错了什么请原谅我。
我正在使用 MKLocalSearch 来显示由字符串指定的位置。我有一个用户和位置,所以一切都已设置。
我已将 MKLocalSearch 添加到我的应用程序,它工作正常,但现在在用户位置上放置了一个 MKPointAnnotation。当然,我希望出现著名的蓝点而不是注释。
我已经尝试查看代码并查找此问题,但没有找到解决方案。
这是我的 MKLocalSearch 代码:
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = "Dispensaries"
request.region = MapView.region
let search = MKLocalSearch(request: request)
search.start(completionHandler: {(response, error) in
if error != nil {
print("Error occured in search")
} else if response!.mapItems.count == 0 {
print("No matches found")
} else {
print("Matches found")
for item in response!.mapItems {
let annotation = MKPointAnnotation()
annotation.title = item.name
annotation.coordinate = item.placemark.coordinate
DispatchQueue.main.async {
self.MapView.addAnnotation(annotation)
}
print("Name = \(String(describing: item.name))")
print("Phone = \(String(describing: item.phoneNumber))")
print("Website = \(String(describing: item.url))")
}
}
})
这是我的 viewForAnnotation
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
var view = mapView.dequeueReusableAnnotationView(withIdentifier: "reuseIdentifier") as? MKMarkerAnnotationView
if view == nil {
view = MKMarkerAnnotationView(annotation: nil, reuseIdentifier: "reuseIdentifier")`
let identifier = "hold"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
if annotationView == nil {
annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
let btn = UIButton(type: .detailDisclosure)
annotationView?.rightCalloutAccessoryView = btn
} else {
annotationView?.annotation = annotation
}
}
view?.annotation = annotation
view?.displayPriority = .required
return view
}
}
在 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation)
中检查注释类型,例如
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation { return nil }
// the rest of your code
}
如果您使用此方法 return nil
,MKMapView
使用其默认的内置注释视图,对于 MKPointAnnotation
它使用红色图钉,对于 MKUserLocation
你要找的蓝点