0

現在、MKAnnotation プロトコルに従っていくつかのオブジェクトが取り込まれたマップ ビューがあります。オブジェクトには、ストアと競合他社の 2 つの異なるタイプがあります。さまざまなオブジェクトには、さまざまな種類のデータが添付されています。

mapView が読み込まれると、プログラムは自動的に店舗と競合他社のすべてのピンをマップにドロップします。各ピンはカスタム イメージを使用します。より広い領域にズームアウトすると、明らかに画面がかなり乱雑になる可能性があります。このブログで説明されているように、近接性に基づいてオブジェクトをフィルタリングする方法を調べました: http://www.fiveminutes.eu/having-fun-with-ios-map-kit-grouping-annotations/

しかし、何人かの同僚と話し合った結果、マップ領域が 1.0 より大きい緯度または経度デルタを持つように変更された後、かなり大きな「正方形スタイル」のピンをより小さな針先のピンに切り替えることにしました。

メソッドを作成し、ユーザーがズームインおよびズームアウトするときに小さいピンと大きいピンを切り替えるプロセスを実装しましたが、この警告を取り除くことはできません。

Sending "MKAnnotationView *" to parameter of incompatible type 'id<MKAnnotation>'

これはおそらく将来的に問題を引き起こす可能性のある何か間違ったことをしていることを意味していることを知っているので、数日以内に v1.1 がリリースされる前に修正したいと思います.

次の方法は、ピンを変更したいポイントを超えて領域が変更されたかどうかをテストする方法です。usingLargeIcons は、アイコンが既に目的のサイズになっているときに change メソッドを呼び出さないようにするブール値です。

-(void)mapView:(MKMapView *)mapViewChanged regionDidChangeAnimated:(BOOL)animated
{
    NSLog(@"latitudeDelta = %f",mapViewChanged.region.span.latitudeDelta);
    NSLog(@"longitudeDelta = %f",mapViewChanged.region.span.longitudeDelta);
    //Sanity check on region
    if(mapView.region.span.latitudeDelta < 1.0){
        if(!usingLargeIcons){
            [self transformPinsLarge];
        }
    }else{
        if(usingLargeIcons){
            [self transformPinsSmall];
        }
    }
}

ご覧のとおり、このメソッドは 2 つの変換メソッドを呼び出しているだけです。メソッドはほとんど同じですが、Small と Large の 2 つの単純な単語の変更があります。私の目標は、マップ上のすべてのピンを取得して配列にダンプし、配列を循環して小さいピンに切り替えることでした。オブジェクトが一致しないという警告が表示される理由がわかりません。ここ SO の別の質問でこれを見逃した場合は、お詫び申し上げます。正しい方向に向けていただければ、すぐに進みます。Google でいくつかのスタイルの質問を検索しましたが、このオブジェクトの警告を説明するものは見つかりませんでした。

変換方法:

- (void)transformPinsSmall
{
    usingLargeIcons = NO;
    NSArray *allPins = [mapView annotations];
    for (MKAnnotationView *a in allPins) {
        //Gets small UIImage for brand, changes pin image
        [[mapView viewForAnnotation:a] setImage:[self imageForSmallAnnotation:a]];
    }
}

警告は for ループのコード行にあります。「imageForSmallAnnotation」メソッドは、UIImage オブジェクトを返すだけです。これらのエラーを削除できるように、これらの画像を型キャストする方法、またはメソッド宣言をキャストする方法を誰かに説明してもらえますか?

ありがとう。

4

1 に答える 1

0

エラーメッセージが実際に

Sending "MKAnnotationView *" to parameter of incompatible type 'id<MKAnnotation>'

...とは対照的にid<MKAnnotationView>

その場合、問題は が[mapView annotations]注釈の配列 (つまり、MKAnnotationプロトコルを採用するオブジェクト) を返すことであり、 for ループがそれらのオブジェクトを にキャストしているためMKAnnotationView、問題が発生します。あなたは試すことができます:

for (id <MKAnnotation> a in allPins) {

...これは、プロトコルを採用するオブジェクトであること[mapView viewForAnnotation:a]が期待されているが、代わりにキャストされたオブジェクトが送信されているという問題を解決します。aMKAnnotationMKAnnotationView

また、キャスト[self imageForSmallAnnotation:]先を変更した場合は、コードが受け取ると予想されるオブジェクトのクラスを受け取っていることを確認する必要がある場合もあります。a

于 2012-04-24T21:23:47.803 に答える