mapView:viewForAnnotation:代码在代码中设置时不调用

时间:2013-04-07 12:56:05

标签: iphone ios objective-c mapkit mkannotation

我有一个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。

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

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

4 个答案:

答案 0 :(得分:2)

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

  1. 关于代码v故事板中的设置委托,很难协调您的各种观察(委托方法didSelectAnnotationView在两种情况下都被调用,但viewForAnnotation不是。在故事板中的代码v中设置它的唯一区别是delegate设置的时间。您没有向我们展示添加注释的过程,因此很难根据您所描述的内容进行诊断。如果你的委托方法都没有被调用,我会怀疑mapView IBOutlet,但是如果有些方法正在运行而其他方法没有,我只能怀疑时间问题。

    < / LI>
  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;
    }
    

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

我也覆盖

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

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

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

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

这解决了我的问题。

答案 3 :(得分:0)

当我在寻找同样的问题时,我只是偶然地回答了这个问题。

我解决了我的问题,在我的情况下我正在调整mapview的大小。 我在调整delegate的大小后添加了mapview。它现在完美无缺。!