2

尝试遵循本教程:http ://www.switchonthecode.com/tutorials/building-an-earthquake-monitor-for-iphone-using-mapkit

我的图标显示在所有正确的位置(和正确的数字),并且图像也显示。(但它总是相同的图像。那是因为条件 if(self.marker.type == "nzpost" 不起作用,因为 type 始终为空(就像 initWithAnnotation() 中标记对象上的所有属性一样) . 由于某种原因,这些属性都是空的。

注解视图界面:

@interface PayMarkerAnnotationView : MKAnnotationView {
    PaymentMarker *marker;
}

@property (strong, nonatomic) IBOutlet PaymentMarker *marker;

@end

带注释的初始化:(这里 self.marker.type 应该有一个值。

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if(self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        self.backgroundColor = [UIColor clearColor];
        NSString* imageName = [[NSString alloc] init];

        if([self.marker.type isEqualToString:@"nzpost"]) {
            imageName = @"icon-map-post.png";
        } else {
            imageName = @"icon-map-incharge.png";
        }
        self.image = [UIImage imageNamed:imageName];
    }
    return self;
}

地图视图:

- (MKAnnotationView *)mapView:(MKMapView *)lmapView viewForAnnotation:(id <MKAnnotation>)annotation {
    PayMarkerAnnotationView *markerView = (PayMarkerAnnotationView *)[lmapView dequeueReusableAnnotationViewWithIdentifier:@"markerView"];
    if(markerView == nil) {
        markerView = [[PayMarkerAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"markerView"];
    }
    markerView.annotation = annotation;
    return markerView;
}

添加我的标记

-(void)renderPaymentMarkers
{
    [self.map addAnnotations: nzPostMarkers];
    [self.map addAnnotations: inChargeMarkers];
}

Marker class:

@interface PaymentMarker : NSObject <MKAnnotation> {
    NSString* type;
    NSString* description;
    float latitude;
    float longitude;}

@property (nonatomic) NSString* description;
@property (nonatomic) NSString* type;
@property (nonatomic) float latitude;
@property (nonatomic) float longitude;

//MKAnnotation
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@end
4

1 回答 1

1

marker变量 inPayMarkerAnnotationView永远不会设置 。

(我不确定您为什么也将其属性IBOutlet设为 an 。)

访问前需要在initWithAnnotation方法中设置:

if (self = [super initWithAnnotation...
    //set marker equal to the annotation this view is being created for...
    marker = annotation;

    self.backgroundColor = [UIColor clearColor];
    ...

但是,您首先不需要该marker变量。
MKAnnotationView已经有一个annotation属性,当您调用super initWithAnnotation.

所以在你的initWithAnnotation, 而不是这个:

if([self.marker.type isEqualToString:@"nzpost"]) {

你可以这样做:

PaymentMarker *pm = (PaymentMarker *)self.annotation;
if([pm.type isEqualToString:@"nzpost"]) {

那应该可以解决主要问题。


另一个潜在的问题是viewForAnnotation,您正在annotation直接更新视图的属性,以防视图被另一个注释重新使用。

这很好(虽然它应该在一个else块中完成)但问题是视图在image更新时也不会annotation更新。

因此,如果先前使用该视图的注释属于“nzpost”类型,但当前注释属于其他类型,则视图仍将显示先前注释类型的图像。

为了解决这个问题,这里有两种可能的解决方案:

  • 为每种类型使用单独的重用标识符(因此有两个 id:“post”和“incharge”)。这样,只有具有匹配图像的视图才会被重新用于当前注释。
  • 覆盖setAnnotation:PayMarkerAnnotationView更新annotationimage属性。我更喜欢这个解决方案。


其他一些完全不相关的项目......

这一行:

NSString* imageName = [[NSString alloc] init];

没有意义,因为稍后的代码只是imageName用新值覆盖。所以分配的内存被放弃了。相反,只需声明imageName

NSString* imageName;

这些属性:

@property (nonatomic) NSString* description;
@property (nonatomic) NSString* type;

应该用copy属性声明(编译器应该抱怨这个):

@property (nonatomic, copy) NSString* description;
@property (nonatomic, copy) NSString* type;

您可能还想更改description属性的名称,因为您正在覆盖由提供的同名属性NSObject(除非这是您的意图)。

于 2012-08-23T00:54:28.007 回答