2

我有一个 UIAlertView,当用户想要删除 RegionAnnotation 时,它会显示为确认。

我无法弄清楚如何访问调用 UIAlertView 的 RegionAnnotationView,我需要它来删除 RegionAnnotation。

这是我损坏的代码 - 你可以看到我试图将 AlertView 的超级视图转换为 RegionAnnotationView (一个公认的坏主意)。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex==0)
    {
        NSLog(@"alertView.superview is a %@",alertView.superview);
        RegionAnnotationView *regionView = (RegionAnnotationView *)alertView.superview;
        RegionAnnotation *regionAnnotation = (RegionAnnotation *)regionView.annotation;

        [self.locationManager stopMonitoringForRegion:regionAnnotation.region];
        [regionView removeRadiusOverlay];
        [self.mapView removeAnnotation:regionAnnotation];    
    }

}
4

1 回答 1

1

由于在用户删除之前选择了注释,因此您可以从地图视图的selectedAnnotations属性中获取对注释的引用。

在警报视图委托方法中,您可以执行以下操作:

if (mapView.selectedAnnotations.count == 0)
{
    //shouldn't happen but just in case
}
else
{
    //since only one annotation can be selected at a time,
    //the one selected is at index 0...
    RegionAnnotation *regionAnnotation 
       = [mapView.selectedAnnotations objectAtIndex:0];

    //do something with the annotation...
}

如果未选择注释,另一个简单的替代方法是使用 ivar 保存对需要删除的注释的引用。

MSK 评论的另一个选项是使用 objc_setAssociatedObject。

无论如何,假设视图层次结构以某种方式使用超级视图并不是一个好主意。

于 2012-08-02T19:12:02.163 回答