MKAnnotationView正在失去对MKAnnotation的引用

时间:2013-09-24 03:47:44

标签: ios objective-c mkmapview mkannotation mkannotationview

在我正在处理的应用中,用户可以按下按钮将MKAnnotations拖放到地图上。当引脚添加到didAddAnnotationViews时,它们将丢弃2或3个引脚,每个引脚都保存到@property,因为我需要稍后引用它,我需要知道它是哪个引脚 - 引脚1, 2或3(它们被丢弃的顺序)。

我正在使用自定义MKAnnotation和MKAnnotationView类为每个注释添加一些NSStrings,我不确定这是否重要。

我正在创建3个这样的属性:

@property (nonatomic, strong) CustomAnnotationView *ann1;
@property (nonatomic, strong) CustomAnnotationView *ann2;
@property (nonatomic, strong) CustomAnnotationView *ann3;

这是我的didAddAnnotationViews

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views
{
    for(MKAnnotationView *view in views)
    {
        if(![view.annotation isKindOfClass:[MKUserLocation class]])
        {
            CustomAnnotationView *newAnnView = (CustomAnnotationView*)view;

            if(newAnnView.type == CustomType1)
            {
                ann1 = newAnnView;
            }
            else if(newAnnView.type == CustomType2)
            {
                ann2 = newAnnView;
            }
            else if(newAnnView.type == CustomType3)
            {
                ann3 = newAnnView;
            }
        }
    }
}

此外,这是我的viewForAnnotation方法:

- (MKAnnotationView *)mapView:(MKMapView *)pMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if([annotation class] == MKUserLocation.class)
    {
        return nil;
    }

    CustomAnnotationView *annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"WayPoint"];

    annotationView.canShowCallout = YES;

    annotationView.draggable = YES;
    [annotationView setSelected:YES animated:YES];

    [annotationView setRightCalloutAccessoryView:customCalloutButton];

    return annotationView;
}

现在,最终,我需要保存这些注释的坐标,这里出现问题。有时,但只有一次,ann1.annotation.coordinate.latitudeann1.annotation.coordinate.longitude都是0.0(这与ann1,ann2或ann3一起发生,仅出于示例目的使用ann1)!为什么会这样?我觉得它与对象引用问题有关,因为MKAnnotationView仍然完好无损,但是注释被清除了。也许我用ann1 = newAnnView分配引用是不好的?我应该使用viewForAnnotation吗?

有人看到我做错的事吗?

更新

我查看了我的MKAnnotation子类,我发现当我根据文档定义一个坐标属性时,我并没有在我的实现文件中对它进行合理化。我现在已经添加了这个并且我还没有能够复制这个问题...如果这最终成为“修复”,我仍然很困惑为什么我的代码在没有@synthesize的情况下大部分工作都会工作。也许我实际上并没有解决它,而是我稍后会让自己失望。

1 个答案:

答案 0 :(得分:1)

我不认为你;应该像这样使用didAddAnnotationViews。通常流程如下:

  1. 创建MKAnnotation或其子类的实例
  2. 分配您提到的字符串
  3. 致电[mapView addAnnotation:myAnnotation]
  4. viewForAnnotation中创建MKAnnotationView(或CustomAnnotationView(基于作为参数提供的annotation
  5. 当您需要保存坐标时,您可以循环遍历mapView.annotations数组,或者如果您保留了名为ann1的ann3变量,ann2,ann3可以逐个保存它们。
  6. 当然,如果您找到了更好的方法,或者这不适合您应用中的其他内容,则无需使用它,但这是迄今为止我见过的唯一流程。