我在地图视图上有一个注释。我可以通过编程方式选择它,但我点击它没有任何反应。你可以帮帮我吗?有没有人遇到类似的问题?这是设置anotations的方法:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"MapVC"];
if (!aView) {
aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MapVC"];
aView.canShowCallout = YES;
aView.draggable=YES;
aView.leftCalloutAccessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
// could put a rightCalloutAccessoryView here
}
aView.annotation = annotation;
[(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];
return aView;
}
将它们添加到地图视图中:
- (void)updateMapView
{
if (self.mapView.annotations) [self.mapView removeAnnotations:self.mapView.annotations];
if (self.annotation) [self.mapView addAnnotation:self.annotation];
}
对于按下注释的反应:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)aView
{
NSLog(@"did select annotation");
}
顺便说一句,方法[self.mapView selectAnnotation:annotation]有效,但没有提出标注(我用断点检查了它)。虽然只是录制注释不会(再次通过断点)。
答案 0 :(得分:7)
如果注释的title
为空或空白,则不会显示标注(即使其他所有内容都已正确设置,包括canShowCallout
)。
点击注释时,将调用didSelectAnnotationView
委托方法,如果注释具有非空白title
,则会显示标注。
关于你在评论中提出的问题:
...是不是我有一个单独的类来包装我的所有数据,我的 annotation类包含该数据类的实例?
这没有什么不妥。
如果你想将与地图相关的逻辑与基类分开,那很好,对于复杂的应用程序来说可能是一个好主意,其中基础数据类可能不仅仅用于注释。
如果您的应用程序非常简单并且数据仅用于注释,那么您可以保持简单并将两者结合起来,但这不是必需的。
只要您坚持使用直接引用而不是尝试,例如,使用数组索引或视图/按钮标记链接回注释中的某些数据对象,“正确”类实现取决于什么适用于你的应用。
答案 1 :(得分:3)
如果没有,请尝试将MKAnnotationView的canShowCallout属性设置为YES。