gpt4 book ai didi

Swift 注释未放置在 MapView 上,因为未调用 viewForAnnotation

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:52 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它可以在用户当前位置放置图钉,也可以根据用户的位置输入来放置图钉。当前位置注释放置得很好,但是当尝试放置用户输入的坐标时,注释没有放置。我已经使用 map.addAnnotation(annotation) 正确添加了注释,其中 annotation.coordinate(对于纽约)是 CLLocationCoordinate2D(纬度:40.713054,经度:-74.007227999999998)。我发现 viewForAnnotation 方法没有被调用,我认为这就是为什么没有放置注释的原因(打印注释没有任何结果)。我有一个请求输入坐标的测试应用程序,它可以放置注释。同样在测试应用程序中,在 viewForPrints 中打印注释输出一个值。

下面我粘贴了一些我认为与该问题相关的代码。如果您需要更多,请发表评论。

import UIKit
import MapKit
import CoreLocation
class MapVC: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {



@IBOutlet weak var map: MKMapView!

override func viewDidLoad() {
super.viewDidLoad()
map.delegate = self
}

下面的这个函数从另一个类中获取值并将坐标转换为 CLLocationCoordinate2D 类型。如上所述,annotation.coordinate(对于纽约)产生 CLLocationCoordinate2D(纬度:40.713054,经度:-74.007227999999998),因此添加用于保存坐标。

    func add(newLocation location_one:[String:Any]) {
let momentaryLat = (location_one["latitude"] as! NSString).doubleValue
let momentaryLong = (location_one["longitude"] as! NSString).doubleValue

let annotation = MKPointAnnotation()
annotation.title = location_one["title"] as? String
annotation.coordinate = CLLocationCoordinate2D(latitude: momentaryLat as CLLocationDegrees, longitude: momentaryLong as CLLocationDegrees)



map.addAnnotation(annotation) //not sure if this adds the annotation!

self.map.centerCoordinate = annotation.coordinate
}


func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

if (annotation is MKUserLocation) {
return nil
}

let identifier = "pinAnnotation"
var annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView

if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true

} else {
annotationView?.annotation = annotation

}
map.showAnnotations(map.annotations, animated: true)
return annotationView
}

最佳答案

首先,

func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?

这是一个委托(delegate)方法,不用于设置注释,它只是

  1. Returns the view associated with the specified annotation object, i.e. The annotation view to display for the specified annotation or nil if you want to display a standard annotation view.`

  2. If you do not implement this method, or if you return nil from your implementation for annotations other than the user location annotation, the map view uses a standard pin annotation view.`

在这里查看-

https://developer.apple.com/reference/mapkit/mkmapviewdelegate/1452045-mapview

addAnnotation() 方法足以添加默认引脚注释。它可能不会被调用,因为您可能已经调用了

func add(newLocation location_one:[String:Any]) 来自后台队列,它调用内部的 addAnnotatinon() 方法。

如果您正在后台队列上的其他一些 Controller 中调用 add 方法,可能是一些完成处理程序,那么您需要明确地执行它并在 ma​​in thread 上调用 add 注释方法

DispatchQueue.main.async {
self.map.addAnnotation(annotation) //Yes!! This method adds the annotations
}

出于调试目的,将您的 Controller 更改为此,甚至删除委托(delegate),然后您也将看到注释。

import UIKit
import MapKit

class ViewController: UIViewController{

@IBOutlet weak var map: MKMapView!

override func viewDidLoad() {
super.viewDidLoad()
let annotation = MKPointAnnotation()
annotation.title = "Test Location"
annotation.coordinate = CLLocationCoordinate2D(latitude: 40.71304, longitude: -74.0072)
self.map.addAnnotation(annotation)
}
}

确保-

  1. The addAnnotation method is called from the main thread
  2. viewForAnnoation method - you use it to provide customisation to the default pin of the annotation.

关于Swift 注释未放置在 MapView 上,因为未调用 viewForAnnotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948828/

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