添加 viewForAnnotations 后 MapView 不显示注释

MapView doesn't show Annotations after adding viewForAnnotations

所以我是第一次使用 MapKit,我想用标注显示注释。

注释出现了,但是一旦我添加了委托函数 viewFor 注释 (func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {}),注释就不再出现了。我在那个函数中遗漏了什么吗?

编辑

我忘了说 View Controller 是 MKMapViewDelegate

的委托
@objc func addAnnotationOnLongPress(gesture: UILongPressGestureRecognizer) {

        if gesture.state == .ended {
            let point = gesture.location(in: self.mapView)
            let coordinate = self.mapView.convert(point, toCoordinateFrom: self.mapView)
            //Now use this coordinate to add annotation on map.
            let annotation = MKPointAnnotation()
            annotation.coordinate = coordinate

            usf.fetchJSON(urlString: usf.setNewLocation(lat: annotation.coordinate.latitude, lon: annotation.coordinate.longitude)) { (data, success) in
                if success {
                    annotation.title = data?.name
                    annotation.subtitle = "HAa"
                } else {
                    let alertUI = self.usf.createAlertOK(title: "Something went wrong!", message: "Cannot get the current weather! \n Check your connectivity or try again later")
                    self.present(alertUI, animated: true, completion: nil)
                }
            }
            let previousAnnotations = self.mapView.annotations
            if !previousAnnotations.isEmpty{
              self.mapView.removeAnnotation(previousAnnotations[0])
            }
            self.mapView.addAnnotation(annotation)
        }        
    }



    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKUserLocation {
            return nil
        }
        print("in viewFor annotation") // prints out
        let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "TempAnnotationView")
        annotationView.canShowCallout = true
        annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        self.mapView.showAnnotations(mapView.annotations, animated: false)
        return annotationView
    }

你需要

if success {
    let annotation = MKPointAnnotation()
    annotation.coordinate = coordinate
    annotation.title = data?.name
    annotation.subtitle = "HAa"
    self.mapView.addAnnotation(annotation)
}

获取名称的 api 是异步的,因此您必须在回调中添加填充注释

您正在实例化 MKAnnotationView。如果您有一些自定义图像,请改为设置 image property of this MKAnnotationView. Or, easier, just use MKPinAnnotationView or MKMarkerAnnotationView

和 Sh_Kahn 一样,确保在闭包内创建注释,而不是在闭包之后。