2

私はNSArrayカスタムMKAnnotationです。最初/最後の注釈に赤いピンの色を設定する必要があります。それ以外の場合は緑のピンを設定します。プログラムは思い通りに動作しません。緑色のピンは毎回 2 つの異なる注釈にランダムに関連付けられており、最初と最後の注釈には関連付けられていません。

だから、これは私が私のコントローラーでやっていることです:

- (void)viewDidLoad
{   
    [super viewDidLoad];   
    //load set a coords from file etc...  
    //self.coordinates is the array of annotations   
    [self.myMap addAnnotations:self.coordinates];  
} 

次に、viewForAnnotation: コールバックで:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
    NSString *ident = @"MY_IDENTIFIER";
    MKPinAnnotationView *annView=(MKPinAnnotationView *)[self.myMap dequeueReusableAnnotationViewWithIdentifier:ident];
    if(self.myMap.userLocation==annotation){
        return nil;
    }
    if(annView == nil){
        annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
        annView.animatesDrop=TRUE;
        annView.canShowCallout = YES;
        annView.rightCalloutAccessoryView=[UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annView.calloutOffset = CGPointMake(-5, 5);
        int currIdxAnn=[self.myMap.annotations indexOfObject:annotation];
        int lastIdxAnn=[self.myMap.annotations indexOfObject:[self.myMap.annotations lastObject]];
        /*
        if (currIdxAnn==0 || currIdxAnn==lastIdxAnn) {
            annView.pinColor=MKPinAnnotationColorRed;
        }else {
            annView.pinColor=MKPinAnnotationColorGreen;
        }*/
         CustomAnnotation *an=(CustomAnnotation *)annotation;
         if (an.tag==98||an.tag==99) {
            annView.pinColor=MKPinAnnotationColorGreen;
         }else {
            annView.pinColor=MKPinAnnotationColorRed;
         }

    }
    return annView;
}

メソッドaddAnnotations:は私が信じているようには機能しないようです。おそらく、配列とは異なる順序で注釈をロードします。出来ますか?
で同様のプロセスを作成しようとしましたdidAddAnnotationViews:が、良い結果は得られませんでした。

いくつかのヒント?ありがとう。

PS:この質問を書き終えたときに、この回答を見つけ、私の理論を確認しているようです。誰かがすでに同様の問題に遭遇しましたか?

編集:いくつかのテストの後、私が望むことを達成するための最良の方法は、最初/最後の注釈にタグを最初に設定することであることに気付きました:

CustomAnnotation *first=[self.coordinates objectAtIndex:0];
first.tag=98;
CustomAnnotation *last=[self.coordinates objectAtIndex:[self.coordinates indexOfObject:[self.coordinates lastObject]]];
last.tag=99;

次に、ご覧viewForAnnotationのとおり、注釈が探していたものであることを理解するために、を少し変更しました。次に、次のように、バックグラウンド スレッドで注釈を追加する関数を呼び出すだけでした。

[self performSelectorInBackground:@selector(addAllAnnot) withObject:nil];

-(void)addAllAnnot{

    [self.myMap addAnnotations:self.coordinates];
}

これは、1週間のテストの後、私にとってはうまくいきました。誰かがより良いアイデアを持っている場合は、感謝します.

4

2 に答える 2