我正在尝试在mapView上显示注释。所有注释都来自JSON对象。它们分为三组。用户可以通过选择segmentedIndex控件上的选项来选择应显示哪些注释。
到目前为止,该应用程序正在按预期运行,用户从segmentedIndex控件中选择一个选项,并且注释显示在mapView上。
我当前的问题是我需要用户单击标注视图以打开另一个viewController。
我认为我的代码是正确的,但我想不是,所显示的标注视图是默认的标注视图,带有标题和副标题。单击任何操作均不会触发。
欢迎任何帮助。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *identifier = @"MyLocation";
if ([annotation isKindOfClass:[PlaceMark class]]) {
MKPinAnnotationView *annotationView =
(MKPinAnnotationView *)[myMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil) {
annotationView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation
reuseIdentifier:identifier];
} else {
annotationView.annotation = annotation;
}
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
// Create a UIButton object to add on the
UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[annotationView setRightCalloutAccessoryView:rightButton];
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[leftButton setTitle:annotation.title forState:UIControlStateNormal];
[annotationView setLeftCalloutAccessoryView:leftButton];
return annotationView;
}
return nil;
}
- (void)mapView:(MKMapView *)mapView
annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
if ([(UIButton*)control buttonType] == UIButtonTypeDetailDisclosure){
// Do your thing when the detailDisclosureButton is touched
UIViewController *mapDetailViewController = [[UIViewController alloc] init];
[[self navigationController] pushViewController:mapDetailViewController animated:YES];
} else if([(UIButton*)control buttonType] == UIButtonTypeInfoDark) {
// Do your thing when the infoDarkButton is touched
NSLog(@"infoDarkButton for longitude: %f and latitude: %f",
[(PlaceMark*)[view annotation] coordinate].longitude,
[(PlaceMark*)[view annotation] coordinate].latitude);
}
}
最佳答案
最有可能未设置 map 视图的delegate
,在这种情况下,它不会调用viewForAnnotation
,而是会创建默认视图(红色图钉带有标注,仅显示标题和副标题-没有按钮)。
头文件中的声明未设置 map 视图的delegate
。这只是告诉编译器该类打算实现某些委托方法。
在xib / storyboard中,右键单击 map 视图,然后将delegate
出口连接到视图控制器,或者在viewDidLoad
中放置mapView.delegate = self;
。
无关,但我想指出的是,在calloutAccessoryControlTapped
中,而不是检查buttonType,您可能只想知道它是右按钮还是左按钮,所以只需执行以下操作:
if (control == view.rightCalloutAccessoryView) ...
有关完整示例,请参见https://stackoverflow.com/a/9113611/467105。
检查
buttonType
至少有两个问题:UIButtonTypeDetailDisclosure
最终实际上会创建一个Info类型的按钮(有关详细信息,请参见MKAnnotationView always shows infoButton instead of detailDisclosure btn)。因此,检查buttonType UIButtonTypeDetailDisclosure将会失败(在iOS 7上)。 关于ios - 注释标注 View 未响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22446204/