【问题标题】:MKPinAnnotationView Callout button should pass custom object to Details ViewControllerMKPinAnnotationView 标注按钮应将自定义对象传递给 Details ViewController
【发布时间】:2026-02-22 08:15:01
【问题描述】:

我有一个符合MKAnnotation 协议的注释类。该类有一个 init 方法,用于设置坐标、标题和副标题。

我创建了一个包含这些注释的数组,并使用addAnnotations:annotationArray 以正常方式将它们添加到 MKMapView。

然后在 MKMapViewDelegage 方法- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 中创建一个 MKPinAnnotationView,并使用自定义 pin 颜色、animatesDrop、canShowCallout。标注有一个 UIButtonTypeDetailDisclosure 类型的 UIButton。

当我运行应用程序并单击地图上的一个图钉时,我会得到预期的结果,即带有标题、副标题和 detailDisclosure 按钮的标注。

我想弄清楚的是,当用户单击详细信息披露按钮时,如何将数据传递到详细信息页面 ([self.navigationController pushViewController:detailsController animated:YES];)。我试图通过向 init 方法添加一个附加参数来修改我的注释类,但是我无法在 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 方法中访问该参数。看来我只能通过像[view.annotation title] 这样的操作从那里访问标题和副标题。

我不确定在这里做什么,我似乎也找不到任何有关如何执行此操作的文档...

再次。我想将对象传递给详细视图控制器。该对象将包含将在详细信息页面上使用的各种数据...

PS - 我正在使用带有 ARC 的 Xcode 4.2。

【问题讨论】:

    标签: ios annotations mkmapview mkannotationview callouts


    【解决方案1】:

    calloutAccessoryControlTapped 中,注释引用是您创建和添加的确切注释对象,但引用的一般类型为id<MKAnnotation>

    要访问注释类中的自定义属性,您可以先对其进行强制转换:

    YourAnnotationClass *myAnn = (YourAnnotationClass *)view.annotation;
    
    //now you can explicitly reference your custom properties...
    NSLog(@"myAnn.customProp = %@", myAnn.customProp);
    

    确保“customProp”被定义为注释类中的属性。

    【讨论】:

    • 是的 - 但请务必先检查 myAnn 的类类型。如果用户点击“当前位置”注释,您也会收到此消息 - 如果您假设它是您的类之一,它将因方法未实现异常而中断。
    • 谢谢安娜,这很好用!还要感谢史蒂夫指出当前位置问题。我已经实现了一些额外的代码来防止这个错误if ([myMapAnnotation isKindOfClass:[MyMapAnnotation class]])