我正在尝试使用非常简单的自定义地图注释视图和标注 - 我创建它时的注释视图,只是将UIImageView作为子视图添加到自身。这很好。
但是,当我在注释视图上调用canShowCallout时,返回视图后会立即在MapKit中抛出异常。堆栈的结尾如下:
#0 0x94e964e6 in objc_exception_throw
#1 0x01e26404 in -[MKOverlayView _addViewForAnnotation:]
#2 0x01e22037 in -[MKOverlayView _addViewsForAnnotations:animated:]
#3 0x01e1ddf9 in -[MKOverlayView showAddedAnnotationsAnimated:]
#4 0x01df9c0e in -[MKMapView _showAddedAnnotationsAndRouteAnimated:]
#5 0x01e0371a in -[MKMapView levelView:didLoadTile:]
我的viewForAnnotation非常简单:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ( ! [annotation isKindOfClass:[MyAnnotation class]] )
return nil;
MyAnnotationView *useView = (MyAnnotationView *)[myMapView dequeueReusableAnnotationViewWithIdentifier:@"resuseview"];
if ( useView == nil )
{
useView = [[[MyAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"resuseview"] autorelease];
useView.canShowCallout = YES; // if commented out view appears just fine
}
else
{ useView.annotation = annotation; }
return useView;
}
如代码中所述,注释视图可以正常工作 - 直到我添加canShowCallout,然后第一次地图获取视图时崩溃。
答案 0 :(得分:13)
答案结果是MyAnnotation(实现MKAnnotation协议)没有实现两种可选的协议方法:
- (NSString *)subtitle;
- (NSString *)title;
因为我已经计划完全自定义标注,我认为我不需要定义这些 - 并且调用堆栈没有显示无法识别的选择器。
另外,我实现这两个只是为了返回nil,但发现为了使注释实际激活一个callout,title
方法(至少)必须返回一个非零值,否则就是callout将不会出现。