我试图创建一个带有注释的简单映射,但是当我尝试运行它时,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
    }

谢谢你的建议。

最佳答案

您不应该遍历tripSpotviewForAnnotation的整个数组。这种方法是针对一个特定的注释的,但是在编写的过程中,它将重复设置(和重置)每个注释的细节附件,使其成为每个aSpottripspot的每个图像,有效地为每个注释提供与上一个tripspot相同的细节附件(这样做效率很低)。
相反,将注释设为MKPointAnnotation的子类并添加一个属性,以便它知道要将哪个图像用于给定的注释。如果tripspot是一个引用类型数组,您可以添加一个属性来引用相关的tripspot条目(然后它可以从中标识要显示的图像)。然后,viewForAnnotation应该从自定义注释子类中检索该属性,而不是遍历tripspot数组。此外,通过包含对基础tripspot条目的引用,您现在还可以让“did select detail assemory”例程知道它与哪个tripspot关联,并采取适当的操作。
另外,我不知道有多少潜在的注释,但是将图像的名称保存在tripspot数组中,而不是保存图像本身可能更为谨慎。图像相对较大,如果有大量注释,则可能会遇到内存问题。根据需要实例化UIImage对象通常比用实际图像填充数组更为谨慎。

08-06 01:00