我正在尝试在mapView上显示注释。所有注释都来自JSON对象。他们分为三组。用户可以选择在segmentedIndex控件上选择选项时应显示哪些注释。
就目前而言,应用程序按预期工作,用户从segmentedIndex控件中选择一个选项,并在mapView上显示注释。
我目前的问题是我需要用户点击标注视图以打开另一个viewController。
我认为我的代码是正确的,但我想不是那时显示的callout视图是默认的calloutview,带有标题和副标题。单击它时不会触发任何操作。
欢迎任何帮助。
- (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);
}
}
答案 0 :(得分:1)
很可能地图视图的delegate
未设置,在这种情况下它不会调用viewForAnnotation
而是会创建一个默认视图(带有标注的红色图钉仅显示标题和副标题 - 没有按钮)。
头文件中的声明不会设置地图视图的delegate
。这只是告诉编译器这个类打算实现某些委托方法。
在xib / storyboard中,右键单击地图视图并将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上)。