0

我有一个地图标记,我在其中添加了一个事件侦听器。当我单击标记时,我可以将它发送到 NSLog 输出一条消息......但是当我然后单击地图时,它也会这样做。我不知道这是否是通常的行为?最后,我试图让一个弹出式视图控制器出现 - 但在这工作之前一直被搁置。

所以......我已经对看起来像这样的注释视图进行了子类化

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if(self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        self.image  = [UIImage imageNamed:@"numberplate.png"];
        self.frame = CGRectMake(0,0,133,40);
        self.centerOffset = CGPointMake(76,0);
        //self.selected = NO;
        self.canShowCallout = NO;
    }
    return self;
}

然后在我的主视图控制器中,我有

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

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

    [eventView addObserver:self
                forKeyPath:@"selected"
                   options:NSKeyValueObservingOptionNew
                   context:GMAP_ANNOTATION_SELECTED];

    eventView.annotation = annotation;
    return eventView;
}

那么在我的事件监听器中,我有

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context{

    NSString *action = (NSString*)context;
    NSLog(@"action received: %@", context);

    if([action isEqualToString:GMAP_ANNOTATION_SELECTED]){
        NSLog(@"ooh you clicked the annotation!");
    }
}

我还将 GMAP_ANNOTATION_SELECTED 设置为

NSString * const GMAP_MAP_SELECTED = @"mapselected";

单击标记时得到的输出与预期的一样。但是当我单击地图区域时,我得到了相同的响应!(好像我点击了地图)。

我是否需要向 mkmap 添加某种侦听器以取消所有注释或其他内容?

4

1 回答 1

2

每次更改“选定”属性时,您都会收到通知。因此,当您的视图被取消选择时,您将收到此通知。因此,如果您刚刚选择了此注释,然后在其他地方点击以取消选择它,您将收到此通知两次。

顺便说一句,您的代码中可能存在细微的错误:如果您最终将此注释视图出列,您可能会多次注册观察者。您需要确保在视图入队时删除观察者,或者只需在创建视图时注册一次观察者(在“if(eventView == nil)”中

于 2010-08-22T17:26:46.227 回答