2

ユーザーがRegionAnnotationを削除したいときに確認として表示されるUIAlertViewがあります。

RegionAnnotationを削除するために必要なUIAlertViewを呼び出したRegionAnnotationViewにアクセスする方法を理解するのに問題があります。

これが私の壊れたコードです-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 に答える