3

我的 MKAnnotations 有一个自定义类,我想覆盖默认mapView:viewForAnnotatation方法,以便可以在标注中添加额外信息。当我在代码中设置我的委托时(根据下面的代码),注释会放在地图上并且是可选择的,但我mapView:viewForAnnoation的从来没有被调用过。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
    NSLog(@"viewForAnnotation: called");
    MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"mapPin"];
    if(!aView){
        aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"mapPin"];
    }
    aView.annotation = annotation;

    return aView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    self.mapView.delegate = self;

}

我知道正在设置委托,因为我可以覆盖该方法-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view,并且在选择注释时会看到 NSLog。

当我从在代码中设置委托更改为在情节提要中设置它时,该方法被调用(NSLog(@"viewForAnnotation: called"); 语句出现)但注释不会出现在地图上,有时会出现此错误:

<Error>: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x8618480]
4

4 回答 4

2

这似乎是两个不同的问题:

  1. 关于代码 v 故事板中的设置委托,很难调和您的各种观察结果(委托方法didSelectAnnotationView在两种情况下都被调用,但viewForAnnotation不是)。在情节提要的代码 v 中设置它的唯一区别是设置的时间delegate。您没有向我们展示添加注释的过程,因此很难根据您的描述进行诊断。如果您的委托方法都没有被调用,我会怀疑mapView IBOutlet.

  2. 关于 的设置MKAnnotationView,默认实现什么都不做。您要么需要编写自己的子类MKAnnotationView,如果您使用自己的图像,则设置其图像,或者更简单,只需使用MKPinAnnotationView. 但是仅仅创建一个MKAnnotationView不会做任何事情。你真的想要:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
        // If it's the user location, just return nil.
        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;
    
        // Handle any custom annotations.
        MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"mapPin"];
        if(aView){
            aView.annotation = annotation;
        } else {
            aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"mapPin"];
        }
    
        aView.canShowCallout = NO;
    
        return aView;
    }
    

    (注意,我不仅要创建 a MKPinAnnotationView,而且还要确保它不是 a MKUserLocation,以防您选择在地图上显示用户位置。我还将显式设置canShowCallout,因为这可能是你写这个方法的原因。)

底线,如果要显示简单的引脚注释视图,请使用MKPinAnnotationView. 单独使用MKAnnotationView将导致没有注释出现。

于 2013-04-07T14:15:37.747 回答
1

mapView:viewForAnnotatation如果其他人正在寻找在代码中设置委托时未调用的原因,则 iOS 6 中存在错误 - http://openradar.appspot.com/12346693

于 2013-08-19T21:36:32.357 回答
0

我遇到了同样的问题,我想分享我的解决方案:

我也覆盖

(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation

但我意识到这些注释的工作方式类似于 TableView 和 iOS 将重用注释,如 TVC(表格视图控制器)中的单元格

由于我只使用一个标识符mapView dequeueReusableAnnotationViewWithIdentifier:@"mapPin",如果它在内存中有足够的“注释”,则不需要再次调用 ViewForAnnotation。

所以我的解决方案是根据我的条件在第一次加载地图时创建多个标识符。

这解决了我的问题。

于 2014-04-09T13:14:42.590 回答
0

当我在寻找同样的问题时,我只是不小心掉到了这个问题上。

我解决了我的问题,就我而言,我正在调整mapview. 我delegate在调整大小后添加了mapview. 它现在完美运行。!

于 2016-07-21T11:32:42.590 回答