启用和禁用注释拖动(动态)(iOS Mapkit)

时间:2012-04-03 14:19:32

标签: ios mapkit

我创建了一个mapview,它有一个按钮,可以在“编辑”之间切换。模式和拖动'模式基于项目要求。我意识到,通过在viewForAnnotation中将它们设置为可拖动,可以使您的注释从创建中拖拽变得容易,但是所需的行为不会允许这样做。我尝试了几种不同的方法将注释更改为可拖动而没有成功。第一个想法是循环现有的注释并将每个注释设置为“可拖动的”#39;并且'选择'但是我得到一个无法识别的选择器发送到实例错误(我确实尝试实例化一个新的注释来传入对象并在循环中重新绘制,但我也得到了同样的错误):

NSLog(@"Array Size: %@", [NSString stringWithFormat:@"%i", [mapView.annotations count]]);

    for(int index = 0; index < [mapView.annotations count]; index++) {

        if([[mapView.annotations objectAtIndex:index]isKindOfClass:[locAnno class]]){
            NSLog(@"** Location Annotation at Index: %@", [NSString stringWithFormat:@"%i", index]);
            NSLog(@"* Location Marker: %@", [mapView.annotations objectAtIndex:index]);
        }

        if([[mapView.annotations objectAtIndex:index]isKindOfClass:[hydAnno class]]) {
            NSLog(@"** Hydrant Annotation at Index: %@", [NSString stringWithFormat:@"%i", index]);
            NSLog(@"* Hydrant Marker: %@", [mapView.annotations objectAtIndex:index]);

            [[mapView.annotations objectAtIndex:index]setSelected:YES];
            [[mapView.annotations objectAtIndex:index]setDraggable:YES];
        }
    }

第二个想法是使用&#39; didSelectAnnotationView&#39;,并在注释被选中时设置选定和可拖动,并在模式再次切换时重置属性。这可行,但非常糟糕,因为事件并不总是会触发,而您的左边会在更改属性之前点击注释一次或多次:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
NSLog(@"Annotation Selected!");
if(!editMode) {
    view.selected = YES;
    view.draggable = YES;
}

}

第一次尝试似乎是最简单的解决方案,如果我可以让它工作。另一方面,使用didSelect方法既麻烦又麻烦。我对iOS开发很陌生,所以如果我在抨击这个问题时忽略了一些新手,我会道歉。我感谢社区提供的任何见解。非常感谢。

1 个答案:

答案 0 :(得分:3)

第一种方法比使用didSelectAnnotationView委托方法更好。

导致“无法识别的选择器”错误的代码问题是它在注释对象(类型setSelected:)上调用setDraggable:id<MKAnnotation>而不是相应的{{ 1}}对象。 MKAnnotationView对象没有这样的方法,因此您会收到“无法识别的选择器”错误。

地图视图的id<MKAnnotation>数组包含对annotations(数据模型)对象的引用 - 而不是这些注释的id<MKAnnotation>个对象。

所以你需要改变这个:

MKAnnotationView

这样的事情:

[[mapView.annotations objectAtIndex:index]setSelected:YES];
[[mapView.annotations objectAtIndex:index]setDraggable:YES];


您还必须更新//Declare a short-named local var to refer to the current annotation... id<MKAnnotation> ann = [mapView.annotations objectAtIndex:index]; //MKAnnotationView has a "selected" property but the docs say not to set //it directly. Instead, call deselectAnnotation on the annotation... [mapView deselectAnnotation:ann animated:NO]; //To update the draggable property on the annotation view, get the //annotation's current view using the viewForAnnotation method... MKAnnotationView *av = [mapView viewForAnnotation:ann]; av.draggable = editMode; 委托方法中的代码,以便将viewForAnnotation设置为draggable而不是硬编码editModeYES因此,如果地图视图需要在之后重新创建注释的视图,您已经在for循环中更新了它,那么注释视图将具有正确的值NO