我正在尝试在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至少有两个问题:
  • 如果要对两个按钮使用相同的类型(例如自定义)怎么办?
  • 在iOS 7中,将按钮设置为UIButtonTypeDetailDisclosure最终实际上会创建一个Info类型的按钮(有关详细信息,请参见MKAnnotationView always shows infoButton instead of detailDisclosure btn)。因此,检查buttonType UIButtonTypeDetailDisclosure将会失败(在iOS 7上)。
  • 关于ios - 注释标注 View 未响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22446204/

    10-13 08:50