在 Swift 中使用 MKLocalSearch 将 pin 附加到用户位置而不是蓝点

Posted

技术标签:

【中文标题】在 Swift 中使用 MKLocalSearch 将 pin 附加到用户位置而不是蓝点【英文标题】:Using MKLocalSearch in Swift attaches a pin to the users location instead of the blue dot 【发布时间】:2019-12-12 16:55:24 【问题描述】:

我是编码和 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))")
        
    
)

这是我对注解的看法

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
    

【问题讨论】:

请编辑您的问题以显示您的viewForAnnotation;此方法需要在接收到的注解是用户位置时返回nil,以便地图视图提供默认的注解视图(蓝点) 感谢您的评论。我编辑了我的问题,希望能包括您正在寻找的内容。虽然,我不确定它是否正确。 【参考方案1】:

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

如果您从此方法返回 nilMKMapView 使用其默认的内置注释视图,MKPointAnnotation 使用红色引脚,MKUserLocation 使用您正在寻找的蓝点。

【讨论】:

是的!解决了它!非常感谢,我很感激!

以上是关于在 Swift 中使用 MKLocalSearch 将 pin 附加到用户位置而不是蓝点的主要内容,如果未能解决你的问题,请参考以下文章

快速从 MKLocalSearch 对象中检索第一个“mapItem”元素

MKMapItem 地标在 swift 中不可用

为啥使用 MKLocalSearch 会返回错误并且无法加载预期结果?

MKLocalSearch 不提供与本地 Apple 地图应用程序中的搜索相同的结果

使用 MKLocalSearch/MapKit 查找附近的餐馆?

MKLocalSearch 返回区域外的结果