1

マップにある注釈に独自の画像を使用したいと思います。しかし、デフォルトのピンしか取得できません。

これが私の mapView:ForAnnotation: Method です

  MKAnnotationView* annotationView = nil;
if ([annotation isKindOfClass:[PlayerLocation class]]){
   PlayerLocation* annotation2 = (PlayerLocation*)annotation;
    static NSString *identifier = @"MyView";   
    MKAnnotationView *annotationView = (MKAnnotationView *) [mapV dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    } else {
        annotationView.annotation = annotation;
    }


    NSString* path = [[NSBundle mainBundle] pathForResource:@"MKAnnotation" ofType:@"png"];
    UIImage* im = [[UIImage alloc] initWithContentsOfFile:path];

    annotationView.image= im;

    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    //delete the flagged Locations
    [self performSelectorOnMainThread:@selector(deletePin:) withObject:annotation2.name waitUntilDone:NO];
}
return annotationView;

何が悪いのかわかりません。画像が nil ではないことがわかりました。デリゲートが設定されています。プロトコルが存在し、メソッドが呼び出されます。

注釈の追加に関連するコード全体を次に示します。「drawGamers」はエントリ ポイントであり、networkhandling クラスによって呼び出されます。

-(void)drawGamers:(NSMutableArray*)locations{

    for(PlayerLocation* loc in locations ){
        [ self replacePin:loc.name withLocation:loc.coordinate];
    }

}

-(void)replacePin:(NSString *)gamerName  withLocation:(CLLocationCoordinate2D)location {
    // flag Location for deletion later
    for (PlayerLocation* annotation in _mapView.annotations){
        if ([annotation.name isEqualToString:gamerName])
            annotation.decomission = YES;
    }
    //add new Location
    PlayerLocation *pLoc = nil;
    pLoc = [[PlayerLocation alloc] initWithName:gamerName address:nil coordinate:location];
    [_mapView addAnnotation:pLoc];
}



- (MKAnnotationView *)mapView:(MKMapView *)mapV viewForAnnotation:(id <MKAnnotation>)annotation{
    MKAnnotationView* annotationView = nil;
    if ([annotation isKindOfClass:[PlayerLocation class]]){
       PlayerLocation* annotation2 = (PlayerLocation*)annotation;
        static NSString *identifier = @"MyView";   
        MKAnnotationView *annotationView = (MKAnnotationView *) [mapV dequeueReusableAnnotationViewWithIdentifier:identifier];
        if (annotationView == nil) {
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        } else {
            annotationView.annotation = annotation;
        }


        NSString* path = [[NSBundle mainBundle] pathForResource:@"MKAnnotation" ofType:@"png"];
        UIImage* im = [[UIImage alloc] initWithContentsOfFile:path];

        annotationView.image= im;

        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        //delete the flagged Locations
        [self performSelectorOnMainThread:@selector(deletePin:) withObject:annotation2.name waitUntilDone:NO];
    }
    return annotationView;
}

-(void)deletePin:(NSString *)stationCode{
    for (PlayerLocation *annotation in _mapView.annotations) {
        if ([annotation.name isEqualToString:stationCode]){  
            if (annotation.decomission==YES)
            [_mapView removeAnnotation:annotation];
        }
    }
}

問題がどこにあるのかわかりません。

4

2 に答える 2

0

ではviewForAnnotationannotationView変数が 2 回宣言されています。

最初に上部に、次にif. したがって、内部の設定は、if外部で宣言された変数には影響しません。

これreturnは、とどまる外部変数に対して行われますnil

内部で変数を再宣言しないでくださいif-- 設定するだけです。

于 2012-09-28T10:52:33.320 に答える
0
- (MKAnnotationView *) mapView:(MKMapView *)mapingView viewForAnnotation:(id <MKAnnotation>) annotation {

     MKAnnotationView* annotationView = nil;
    if ([annotation isKindOfClass:[PlayerLocation class]])
    {
         PlayerLocation* annotation2 = (PlayerLocation*)annotation;
         static NSString *identifier = @"MyView";   

         annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];


         NSString* path = [[NSBundle mainBundle] pathForResource:@"MKAnnotation" ofType:@"png"];
         UIImage* im = [[UIImage alloc] initWithContentsOfFile:path];

         annotationView.image= im;//you can set your image here.

         annotationView.enabled = YES;
         annotationView.canShowCallout = YES;
         //delete the flagged Locations
         [self performSelectorOnMainThread:@selector(deletePin:) withObject:annotation2.name waitUntilDone:NO];
     }
return annotationView;

}

-(void)deletePin:(NSString *)stationCode{
    for (PlayerLocation *annotation in _mapView.annotations) {
        if ([annotation.name isEqualToString:stationCode]){  
            if (annotation.decomission==YES)
            [_mapView removeAnnotation:annotation];
        }
    }
}

これは、問題の解決に役立つ場合があります。

于 2013-04-02T04:29:44.280 に答える