访问 alertView 的调用视图

Posted

技术标签:

【中文标题】访问 alertView 的调用视图【英文标题】:access an alertView's calling view 【发布时间】:2012-08-02 18:47:18 【问题描述】:

我有一个 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];    
    


【问题讨论】:

使用github.com/rsaunders100/UIAlertView-Blocks可以帮助你吗?想法是使用块而不依赖 UIAlertView 的委托方法(如 clickedButtonAtIndex) 警报视图在哪里显示?注释是否在用户可以删除之前“被选中”? 或者你可以使用objc_setAssociatedObject.. 注释确实被选中,用户才能删除。 我的猜测是我遗漏了一些简单的东西,因为访问创建警报视图的视图必须是警报视图的要点之一。 【参考方案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。

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

【讨论】:

我不知道该在哪里发布,但我遇到的大部分精彩答案都来自您。事实上,当我在上面的 cmets 中看到你的名字时,我真的松了一口气。 当我们在做的时候 - 有什么关于学习成为 ios 忍者的建议吗? 例如,我从来没有遇到过像“objc_setAssociatedObject”这样的东西,也不知道从哪里开始.. 谢谢。我可以建议研究文档、Apple 示例应用程序、查看其他出色的 SO 答案以及大量练习。 关于 objc_setAssociatedObject,我相信这是这种情况下通用的“优雅”解决方案。 This answer by Anomie 快速概述了如何使用它。

以上是关于访问 alertView 的调用视图的主要内容,如果未能解决你的问题,请参考以下文章

同一个视图中的多个 UIAlertViews

带有视图控制器的 Xcode 和 alertview

在alertview中选择取消按钮时如何从数组中关闭所有alertview?

Xcode Swift alertView 在进入根控制器后消失

当 Push Notification AlertView 出现在视图上时如何突出显示特定的视图区域?

如何将另一个 ViewController 设置为 AlertView 的委托