swift mapkit 注释重复相同的 CalloutAccessoryView 图像

swift mapkit annotations repeating the same CalloutAccessoryView image

我尝试制作一个带有注释的简单地图,但是当我尝试 运行 它时,detailCalloutAccessoryView 的图像是相同的,但我确定我放了两个不同的图像,这是怎么发生的?或者有人有更好的方法吗?

   var tripspot:[tripSpot] = [
    tripSpot( title: "1", coordinate: CLLocationCoordinate2DMake(24.149062, 120.684891),  location: "台中市北區一中街", type: "rare",cllocation:CLLocation(latitude: 24.181143,  longitude: 120.593158),image : "025"),
    tripSpot( title: "2", coordinate: CLLocationCoordinate2DMake(24.180407, 120.645086), location:"台中逢甲", type: "rare",cllocation:CLLocation(latitude: 24.180407,  longitude: 120.645086),image : "007")]
   // Build LocationManager
let locationManager = CLLocationManager()


 override func viewDidLoad() {
    super.viewDidLoad()


    // set data
    setupData()

}

func setupData(){
    for aSpot in tripspot {
            //set annotation
            let coordinate = aSpot.coordinate
            let title = aSpot.title
            let type = aSpot.type

            //set annotation
            let tripSpotAnnotation = MKPointAnnotation()
            tripSpotAnnotation.coordinate = coordinate
            tripSpotAnnotation.title = title
            tripSpotAnnotation.subtitle = type
            mapView.addAnnotations([tripSpotAnnotation])



        }
    }
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
{
    if annotation.isKindOfClass(MKUserLocation)
    {

        return nil
    }

    var view = mapView.dequeueReusableAnnotationViewWithIdentifier("annotationIdentifier")as? MKPinAnnotationView

    if view == nil
    {
        view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotationIdentifier")
        view?.canShowCallout = true
        view?.sizeToFit()
    }
    else{
        view!.annotation = annotation
    }
    for aSpot in tripspot{

        // set pinview
        let detailCalloutAccessoryView = UIImageView(frame: CGRectMake(0, 0, 53, 53))
        detailCalloutAccessoryView.image = UIImage(named: aSpot.image!)
        view?.detailCalloutAccessoryView = detailCalloutAccessoryView

    view?.pinTintColor = pinColor(annotation.subtitle!!)
    }
    return view
    }

感谢任何建议。

您不应遍历 viewForAnnotationtripSpot 的整个数组。此方法适用于特定注释,但其编写方式将重复设置(并重置)每个注释的详细信息附件为 tripspot 中每个 aSpot 的每个图像,有效地给出每个注释都与最后一个 tripspot 具有相同的细节附件(并且效率低下)。

相反,使您的注释成为 MKPointAnnotation 的子类并添加 属性 以便它知道给定注释使用哪个图像。如果 tripspot 是一个引用类型数组,您可能只需添加一个 属性 来引用相关的 tripspot 条目(然后它可以从中识别要显示的图像)。然后,viewForAnnotation 应该从您的自定义注释子类中检索 属性,而不是遍历 tripspot 数组。此外,通过包含对基础 tripspot 条目的引用,您现在还可以让 "did select detail accessory" 例程知道它与哪个旅行点相关联,并采取适当的行动。

顺便说一句,我不知道有多少潜在的注释,但将图像名称保存在 tripspot 数组中而不是图像本身可能更为谨慎。图像相对较大,如果您有很多注释,则可能会 运行 出现内存问题。通常更谨慎的做法是根据需要实例化 UIImage 对象,而不是用实际图像填充数组。