我有以下问题:
我的地图上有很多针脚。触摸一个后,将打开一个自定义弹出窗口并显示信息。这很完美。
我的问题是,如果您选择两次相同的图钉,则弹出窗口不会打开,您必须触摸另一个图钉或点击地图中的某个位置。
我的代码如下:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
MKAnnotationView* annotationView = nil;
CPPointOfInterest *myAnnotation = (CPPointOfInterest*) annotation;
if ([myAnnotation isKindOfClass:[MKUserLocation class]] || myAnnotation.poi_id <= 0) {
return nil;
} else {
NSString* identifier = @"Pin";
MKPinAnnotationView* annView = (MKPinAnnotationView*)[mv_map dequeueReusableAnnotationViewWithIdentifier:identifier];
if(nil == annView) {
annView = [[[MKPinAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease];
}
[annView addObserver:self
forKeyPath:@"selected"
options:NSKeyValueObservingOptionNew
context:@"GMAP_ANNOTATION_SELECTED"];
if(self.nearest_poi == myAnnotation) {
annView.pinColor = MKPinAnnotationColorGreen;
} else {
annView.pinColor = MKPinAnnotationColorRed;
}
annView.animatesDrop = YES;
annotationView = annView;
[annotationView setEnabled:YES];
[annotationView setCanShowCallout:NO];
return annotationView;
}
}
观察:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
NSString *action = (NSString*)context;
if([action isEqualToString:@"GMAP_ANNOTATION_SELECTED"]){
BOOL annotationAppeared = [[change valueForKey:@"new"] boolValue];
if (annotationAppeared) {
// show popup
}
}
}
我也尝试了didSelectAnnotationView方法,这也适用于第一次点击事件。
我搜索了几个小时,但没有找到......:/
有没有人知道我的问题的解决方案,请给我一个提示......
谢谢和问候, 马修
答案 0 :(得分:3)
您必须先通过mapView取消选择注释,然后才能再次选择它。尝试下面的内容:
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[mapView deselectAnnotation:view.annotation animated:NO];
}
答案 1 :(得分:1)
我正在使用弹出框来显示信息:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
if (popover)
{
[popover release];
popover = nil;
}
LocatorSearchDealer *dealer = [[mapView selectedAnnotations] objectAtIndex:0];
//without this line I cannot immediately reselect the same annotation.
[mapView deselectAnnotation:dealer animated:NO];
}