iOS在mapkit中引脚颜色问题

我想要两种颜色的注释。 为此,我使用了以下代码,

- (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation {   static NSString *identifier = @"MyLocation";   if ([annotation isKindOfClass:[PlaceMark class]]) {     MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];     annotationView.enabled = YES;     annotationView.canShowCallout = YES;     @try {       if (annotationView == nil) {         annotationView = [[MKPinAnnotationView alloc]                  initWithAnnotation:annotation                  reuseIdentifier:identifier];       } else {         annotationView.annotation = annotation;                 if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"])         {           annotationView.pinColor = MKPinAnnotationColorRed;         }         else         {           annotationView.pinColor = MKPinAnnotationColorGreen;         }       }     }     @catch (NSException *exception) {       NSLog(@"nsCenterOrOffice exception = %@",exception);     }     return annotationView;   }   return nil; } 

但是我仍然无法为所需的注释设置所需的颜色。 有时特定的注释针颜色是红色的,有时是绿色的。 我不明白为什么会发生这种情况。 有谁能够帮助我 ? 谢谢…

我重写我的代码..这是我更新的代码

MapAnnotation.h

  #import <MapKit/MapKit.h> #import <Foundation/Foundation.h> @interface MapAnnotation : MKPointAnnotation {  NSString *title;  NSString *subtitle;  int dealLnk;  float latitude;  float longitude;   CLLocationCoordinate2D coordinate; } @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; @property (nonatomic, assign) int dealLnk; @property (nonatomic, assign) float latitude; @property (nonatomic, assign) float longitude; @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; - (id)initWithTitle:(NSString *)ttl subTitle:(NSString *)subttl dealLink:(int)dealLnk latitude:(float)latitude longitude:(float)longitude andCoordinate:(CLLocationCoordinate2D)c2d; @end 

MapAnnotation.m

 #import "MapAnnotation.h" @implementation MapAnnotation @synthesize title,subtitle,dealLnk,coordinate,latitude,longitude; - (id)initWithTitle:(NSString *)ttl subTitle:(NSString *)subttl dealLink:(int)z latitude:(float)latitude1 longitude:(float)longitude1 andCoordinate:(CLLocationCoordinate2D)c2d {  title = ttl;  subtitle = subttl;  dealLnk =z;  coordinate = c2d;  longitude = longitude1;  latitude = latitude1;   return self; } @end 

这是我的实现文件

 -(void)startAddingAnnotation {  @try {    CLLocationCoordinate2D annotationCoord;       z=0;    for (int i=0; i < [nslatitude count] ; i++,z++)    {           MapAnnotation  *dealAnnotation  = [[MapAnnotation  alloc] init];           dealAnnotation.dealLnk = z;      annotationCoord.latitude =  (CGFloat) [[nslatitude objectAtIndex:i] floatValue];      annotationCoord.longitude = (CGFloat)[[nslongitude objectAtIndex:i] floatValue];      dealAnnotation.coordinate = annotationCoord;           dealAnnotation.title = [nsCenterName objectAtIndex:i];      dealAnnotation.subtitle = [nsCenterAddress objectAtIndex:i];           NSLog(@"latitude = %f",dealAnnotation.latitude);      NSLog(@"longitude = %f",dealAnnotation.longitude);           NSLog(@"dealAnnotation.dealLnk = %d",dealAnnotation.dealLnk);      NSLog(@"dz = %d",z);      [mapView addAnnotation:dealAnnotation];        }     }  @catch (NSException *exception) {       NSLog(@"Exception = %@",exception);  }   cord.longitude = -112.05186;  cord.latitude = 33.46577;   MKCoordinateRegion region;  region.center = cord;   MKCoordinateSpan span = {.latitudeDelta = 1.0, .longitudeDelta = 1.0};  region.span = span;   [mapView setRegion:region];  } #pragma mark - MapView_Delegate - (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation {   MapAnnotation *annotation1 = (MapAnnotation *)annotation;  z = annotation1.dealLnk;    NSLog(@"annotation1.longitude = %f",annotation1.latitude);   NSLog(@"annotation1.longitude = %f",annotation1.longitude);   if(z<[nslatitude count])  {    MKAnnotationView *pinView = nil;    static NSString *defaultPinID = @"pin1";       pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];         if ( pinView == nil )      pinView = [[MKAnnotationView alloc]           initWithAnnotation:annotation1 reuseIdentifier:defaultPinID];    pinView.canShowCallout = YES;       @try {           if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"])      {        pinView.image = [UIImage imageNamed:@"flag1.png"];      }      else      {        pinView.image = [UIImage imageNamed:@"flag2.png"];      }      pinView.annotation = annotation1;      pinView.tag = [[nsCenterName objectAtIndex:z] intValue];         }    @catch (NSException *exception) {      NSLog(@"nsCenterOrOffice exception = %@",exception);    }       UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];    [rightButton setTitle:annotation.title forState:UIControlStateNormal];    [pinView setRightCalloutAccessoryView:rightButton];    return pinView;  }  else  {    return nil;  } } 

现在的问题是,所有的注释都指向不同的位置。 我不明白为什么会发生这种情况? 我的代码中是否有任何错误?

确定引脚颜色的条件是基于此委托方法之外的数据,并且不能保证与为特定注释调用此委托方法时同步。

在这个条件下:

 if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"]) 

zvariables显然是在这个委托方法之外声明和设置的一个实例variables(可能正好在添加注释之前)。

同样, 不能保证 viewForAnnotation委托方法将在添加注释之后被立即调用。 也不保证委托方法每次只能被调用一次。 所以有可能的是, z值并不对应于委托方法被调用的当前 annotation

在调用addAnnotation之后调用delegate方法是非常有可能的,它将以不同于添加注释的顺序被调用,并且对于每个注释将被调用多次(例如,如果用户平移或放大地图和注释回来查看)。

要解决此问题,请将“is center or office”属性添加到Placemark类本身,并在创build注释时以及调用addAnnotation 之前设置该属性。 然后,在viewForAnnotation方法中,可以将annotation参数viewForAnnotation为地Placemark并访问属性以实现条件。 例如:

 //where you create and add the annotation: Placemark *pm = [[Placemark alloc... pm.coordinate = ... pm.title = ... pm.centerOrOffice = [nsCenterOrOffice objectAtIndex:z]; [mapView addAnnotation:pm]; //in viewForAnnotation: Placemark *myPlacemark = (Placemark *)annotation; if ([myPlacemark.centerOrOffice isEqualToString:@"C"]) ... 

一个单独的,不相关的问题是注解视图创build逻辑不太正确。
代码调用initWithAnnotation两次,实际上第二个initWithAnnotation永远不会被调用,因为第一次调用总是成功的。

你可能想要的是首先调用dequeueReusableAnnotationViewWithIdentifier:然后,如果返回nil ,则调用initWithAnnotation

viewForAnnotation重构代码时,一定要将设置pinColor的代码放在注释视图的dequeue / init 之外 (例如在return annotationView;之前),以正确处理重用视图。

您的viewForAnnotation依赖于一些外部variables, nsCenterOrOfficez 。 直到您向我们展示如何设置这些variables,我们当然无法帮到您。

无论如何,这不是一个谨慎的做法。 你的viewForAnnotation一般应该只依赖annotation属性,而不是外部variables。