iphone mkannotationview奇怪的问题 - 可能被重用

时间:2010-08-29 15:28:18

标签: iphone mapkit mkannotation mkannotationview

我刚刚在我的子类mkannotationview中发现了一个奇怪的问题。

当我添加前5个标记时,它们都能完美地工作。在mkannotationview子类中,我NSLog一条消息,我看到了5次。但是,当我删除所有标记并重绘它们时 - 使用所有相同的方法,我只看到NSLog一次。

这就像地图重用现有的注释视图一样?有没有办法强迫它每次使用新的?

[代码更新]

因此我无法重复使用(这可能是也可能不是问题)的原因是我正在使用标签创建唯一标记。标记上的标签包含对单个标记的引用(将其视为产品ID)

所以......在ProductPlot.h中

@interface ProductPlot : NSObject <MKAnnotation> {
    NSString *productID;
    float latitude;
    float longitude;
}
@property (nonatomic, copy) NSString *productID;

和ProductPlot.m

@implementation ProductPlot
@synthesize productID;

- (CLLocationCoordinate2D)coordinate {
    CLLocationCoordinate2D coord = {self.latitude, self.longitude};
    return coord;
}

- (NSString *) productID {
    return productID;
}

然后我将注释视图子分类为ProductPlotView.h

@interface ProductPlotView : MKAnnotationView {
ProductPlot *product;
}

并在ProductPlotView.m

@implementation ProductPlotView

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if(self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {

        product = (ProductPlot *)annotation;
        UILabel *plate2 = [[[UILabel alloc] init] autorelease];
        plate2.text = product.productID;
        plate2.frame = CGRectMake(35, 4, 100, 30);
        plate2.backgroundColor = [UIColor clearColor]; //]clearColor];
        [plate2 setFont: [UIFont fontWithName: @"myFont" size: plate2.font.pointSize]];

        [self addSubview:plate2];
    }
    self.frame = CGRectMake(0,0,133,40);

    return self;
}

然后在我的代码中,我使用

绘制点
- (void)plotPoint: (int) y latitude: (double) lat longitude: (double) lng productID: (NSString *) pID {

    ProductPlot *newAnnotation = [[ProductPlot alloc] init];
    newAnnotation.latitude = lat;
    newAnnotation.longitude = lng;
    newAnnotation.productID = pID;
    [mapView addAnnotation:newAnnotation];

    [newAnnotation release];

}

我也有处理注释的代码。

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



    ProductPlotView *eventView = (ProductPlotView *)[lmapView
                                    dequeueReusableAnnotationViewWithIdentifier:@"eventview"];
    if(eventView == nil) {
        eventView = [[[VehicleViewInfo alloc] initWithAnnotation:annotation
                                                     reuseIdentifier:@"eventview"]
                     autorelease];
    }

    eventView.annotation = annotation;
    return eventView;
}

所以...以上将采用productID并将其放在作为地图标记的标签上。这似乎在FIRST绘图实例上完美运行,但如果我删除标记(使用[mapView removeAnnotations:mapView.annotations];)然后再次调用此函数,它会绘制点OK,但产品ID不正确。它似乎随机抽取它们。

  

注意:上面的代码有一些   部分已删除,因此可能存在拼写错误

感谢您的任何信息。

2 个答案:

答案 0 :(得分:0)

要回答我自己的问题,我在MKAnnotationView* annotationView = nil;代码的顶部添加了- (MKAnnotationView *)mapView:(MKMapView *)lmapView viewForAnnotation:(id <MKAnnotation>)annotation

现在它似乎完美无缺。我仍然希望看到其他人是否认为这是正确的方法吗?

答案 1 :(得分:0)

我解决了在注释视图上检查子视图的类似问题。 如果它没有子视图我创建一个新标签并将其添加为子视图,如果它有子视图我采取第一个并编辑label.text属性。 这样子视图总是零或只有一个。