5

200 を超えるオブジェクトを含む配列があり、それぞれをループしようとしています。

各オブジェクトにははい/いいえフィールドがあり、そのはい/いいえの値に応じて異なる色のマーカーを表示したいと考えています。

私が見ることができることから、私のループは最初に各オブジェクトを通過し、次にすべての注釈が各オブジェクトの最後に追加されます。

すべての注釈がマップに追加されたときに、ループ内で yes no 値の配列を介してチェックを実行するため、すべてをプロットするときに、配列内の最後のオブジェクトの yes/no 値が使用されます。

個々の要素のはい/いいえの値に応じてマーカーが異なるようにするにはどうすればよいですか?

私のコードは

for (i = 0; i < [appDelegate.itemArray count]; i++) {
        item_details *tempObj = [appDelegate.itemArray objectAtIndex:i];
        location.latitude = [tempObj.lat floatValue];
        location.longitude = [tempObj.lon floatValue];
        current_yesno = tempObj.yesno;
        MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc]initWithTitle:tempObj.name andCoordinate:location];
        [self.mapView addAnnotation:newAnnotation];
        [newAnnotation release];            
            } 

次のように私の注釈コードで

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{

    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];

if(current_yesno == YES){
    annView.pinColor = MKPinAnnotationColorGreen;
}
else
{
    annView.pinColor = MKPinAnnotationColorRed;
}
    annView.animatesDrop=NO;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;

}

current_yesno私の.hファイルで宣言されています。

4

2 に答える 2

8

viewForAnnotationデリゲート メソッドは、必ずしも実行直後に呼び出されるとは限りません。またaddAnnotation、マップ ビューが注釈のビューを取得する必要があるときに (コードがまったく異なることを実行しているときに) 呼び出すこともできます。

そのため、ivar の値がそのデリゲート メソッドの外部のコードと同期していることに依存することはできません。

代わりに、yesnoプロパティをカスタムMapViewAnnotationクラスに追加し、アノテーションの作成時に設定してviewForAnnotationから、パラメーターを介してその値にアクセスしannotationます (つまり、マップ ビューは、ビューが必要とする正確なアノテーション オブジェクトへの参照を提供します)。

例:

MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc] init...
newAnnotation.yesno = tempObj.yesno;  // <-- set property in annotation
[self.mapView addAnnotation:newAnnotation];

次にviewForAnnotation

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
    if (![annotation isKindOfClass:[MapViewAnnotation class]])
    {
        // Return nil (default view) if annotation is 
        // anything but your custom class.
        return nil;
    }

    static NSString *reuseId = @"currentloc";

    MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (annView == nil)
    {
        annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];        
        annView.animatesDrop = NO;
        annView.canShowCallout = YES;
        annView.calloutOffset = CGPointMake(-5, 5);
    }
    else
    {
        annView.annotation = annotation;
    }

    MapViewAnnotation *mvAnn = (MapViewAnnotation *)annotation;
    if (mvAnn.yesno)
    {
        annView.pinColor = MKPinAnnotationColorGreen;
    }
    else
    {
        annView.pinColor = MKPinAnnotationColorRed;
    }

    return annView;
}
于 2012-06-05T15:31:55.337 に答える
0
MKPinAnnotationView *pin = (MKPinAnnotationView *) [self.mapView dequeueReusableAnnotationViewWithIdentifier: @"id"];
if (pin == nil)
{
    pin = [[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"id"] ;
}
else
{
    pin.annotation = annotation;
}

pin.pinTintColor=[UIColor blueColor];
pin.canShowCallout = true;
于 2015-10-02T06:18:29.410 に答える