我有一个地图标记,我在其中添加了一个事件侦听器。当我单击标记时,我可以将它发送到 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 添加某种侦听器以取消所有注释或其他内容?