【问题标题】:How to remove annotations that are created in a for loop如何删除在 for 循环中创建的注释
【发布时间】:2013-02-21 07:46:54
【问题描述】:

我希望你能帮助我。我正在为学校做一些家庭作业,我们必须创建一个项目,该项目采用一组对象并从地图上的这些对象创建地图注释。我的对象有两个值,一个是 NSString *title,另一个是名为 coord 的 cllocationcoordinate2d。我有一个 for 循环填充我的地图视图上的地图注释,从数组中获取这些对象。

我的问题是:对于我的任务,我应该可以选择从我的数组中删除某些对象,并让地图视图从注释中删除那些已删除的对象。我不应该清除所有注释并在没有删除对象的情况下重新填充它们。换句话说,我想知道是否有一种方法可以从该方法的外部选择在 for 循环中创建的某个注释。我需要在注释对象中创建自定义 id 参数吗?

我会粘贴代码,但我不确定您需要查看什么。另外,如果这个问题含糊不清或令人困惑,我深表歉意;我以前从未真正使用过这个网站,也不必向任何人提出问题。先感谢您。

【问题讨论】:

    标签: objective-c for-loop annotations mkmapview


    【解决方案1】:

    试试这个代码,

    NSMutableArray *annotationsToRemove = [[NSMutableArray alloc] init];
    
     for (int i = 0; i < [mapView.annotations count]; i++) {
    
        NSString *anonotationTitle = [[mapView.annotations objectAtIndex:i] title];
    
        if([annotationTitle isEqualToString:@"titleToDelete"]){
            [annotationsToRemove addObject:[mapView.annotations objectAtIndex:i]];
        }
    
     }
    
     [mapView removeAnnotations:annotationsToRemove];
    

    【讨论】:

    • 这不只是创建注释的第二个实例,它存储在 myAnnotations 数组中但实际上并未放在地图上吗?
    • 这样做的好处是,您可以遍历辅助注释数组,获取要删除的注释(可能正在检查注释标题),然后从地图中删除该注释。
    • 我在自定义注释类中为标题设置了一个属性。有没有办法使用我创建的标题从 mapview.annotations 数组中获取注释?
    • 这是我用于注释类的初始化,顺便说一句。 //自定义初始化函数 -(id)initWithTitle:(NSString*)text coord:(CLLocationCoordinate2D)coord;
    • 我更改了代码,在这一行 if([annotationTitle isEqualToString:@""]) ,给你要删除的注释标题。 isEqualToString:@"titleToDelete"
    【解决方案2】:

    好的,你可以创建MKAnnotationView的自定义注解子类。

    例如:

    MyCustomAnnotationView.h

    #import <Foundation/Foundation.h>
    @class MKAnnotationView;
    
    @interface MyCustomAnnotationView : MKAnnotationView
    @property (nonatomic, strong) NSString* customId;
    
    @end
    

    MainViewController.m

    ...
    - (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        static NSString* annotationIdentifier = @"annotationIdentifier";
        MyCustomAnnotationView* annotationView =
        (MyCustomAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:SFAnnotationIdentifier];
        annotationView.customId = [dataSource title];
        ....
    }
    ....
    

    并通过您的 customId 属性从您的数据源中删除他

    【讨论】:

    • 谢谢,我明天再研究一下 c:
    【解决方案3】:

    您打算如何选择要删除的注释?如果它是通过点击附件控件(当您点击一个图钉时弹出的窗口右侧的小图标)完成的,那么您可以获得对注释的引用并将其从地图中删除,就像这样

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    {
        MKAnnotation *tappedAnnotation = view.annotation;
        [mapView removeAnnotation:tappedAnnotation];
    }
    

    参考:MKMapViewdelegate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-17
      • 2017-05-29
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2018-03-19
      相关资源
      最近更新 更多