1

アノテーション付きの簡単な地図を作ってみたのですが、実行してみると、detailCalloutAccessoryView の画像は同じなのに、確かに違う画像を 2 つ入れているのですが、どうしてこうなったのでしょうか? または、これを行うためのより良い方法はありますか?

   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
    }

アドバイスをありがとう。

4

1 に答える 1

1

tripSpotinの配列全体を反復処理しないでくださいviewForAnnotationaSpotこのメソッドは特定の注釈用ですが、これが記述されている方法では、すべての注釈の詳細アクセサリーを繰り返し設定 (およびリセット) して、すべての各画像に対してtripspot、効果的にすべての注釈に最後のものと同じ詳細アクセサリーを与えますtripspot(非効率的に行う)。

代わりに、注釈を のサブクラスにMKPointAnnotationしてプロパティを追加し、特定の注釈に使用する画像を認識できるようにします。tripspotが参照タイプの配列である場合は、関連するtripspotエントリを参照するプロパティを追加するだけです (そこからどの画像を表示するかを識別できます)。次に、配列viewForAnnotationを反復処理するのではなく、カスタム注釈サブクラスからそのプロパティを取得する必要があります。tripspotまた、基になるtripspotエントリへの参照を含めることで、「詳細アクセサリを選択した」ルーチンを使用して、関連付けられているトリップスポットを認識し、適切なアクションを実行できるようになりました。

余談ですが、潜在的な注釈がいくつあるかはわかりませんがtripspot、画像自体ではなく、画像の名前を配列に保存する方が賢明かもしれません。画像は比較的大きく、注釈が多いとメモリの問題が発生するリスクがあります。通常UIImage、実際の画像を配列に入力するよりも、必要に応じてオブジェクトをインスタンス化する方が賢明です。

于 2016-07-14T19:55:54.723 に答える