在我正在使用的应用程序中,系统指示用户按按钮将MKAnnotations拖放到地图上。它们将丢弃2或3个引脚,当在didAddAnnotationViews中添加该引脚时,每个引脚都会保存到@property中,因为稍后我需要引用它,并且我需要知道它是哪个引脚-引脚1、2或3(删除顺序)。

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

我正在创建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或an3中发生,仅出于示例目的使用an1)!为什么会这样呢?我感觉它与对象引用问题有关,因为MKAnnotationView仍然完好无损,但注释已清除。我为ann1 = newAnnView分配引用可能很糟糕?我应该使用viewForAnnotation吗?

有人看到我做错了吗?

更新

我查看了我的MKAnnotation子类,发现在根据文档定义坐标属性时,我没有在实现文件中@synthesize它。我现在添加了这个信息,但我还无法复制问题……如果最终以“修复”的方式出现,我仍然很困惑为什么我的代码在大多数情况下如果没有@synthesize就可以正常工作。也许我并没有真正解决它,后来我让自己失望了。

最佳答案

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


创建一个MKAnnotation或其子类的实例
分配您提到的字符串
致电[mapView addAnnotation:myAnnotation]
viewForAnnotation中,根据参数提供的MKAnnotationView创建CustomAnnotationView(或annotation
当您需要保存坐标时,可以循环遍历mapView.annotations数组,或者如果保留了名为ann1,ann2的thre3变量,则ann3可以将其一一保存。


当然,如果您找到了一种更好的方法,或者它不适合您的应用程序,则不需要使用它,但这是我到目前为止唯一看到的流程。

10-04 13:16