我创建了一个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开发很陌生,所以如果我在抨击这个问题时忽略了一些新手,我会道歉。我感谢社区提供的任何见解。非常感谢。
答案 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
而不是硬编码editMode
或YES
因此,如果地图视图需要在之后重新创建注释的视图,您已经在for循环中更新了它,那么注释视图将具有正确的值NO
。