ABFRealmMapView委托混淆

时间:2015-11-08 09:19:16

标签: delegates mkmapview realm

使用iOS-v9.1,XCode-v7.1:

我的mapView的委托方法尚未运行。

以下适用:

  • mapView属性的类型为ABFRealmMapView enter image description here
  • ABFRealmMapView是一个继承自MKMapView的类 enter image description here
  • ABFRealmMapView有一个externalDelegate定义,如下所示: enter image description here
  • 发生map-overlay时,renderForOverlay委托方法正确执行: enter image description here
  • 这个想法是这个实现还调用父类PVParkMapView的委托方法“renderForOverlay”(因为这个实例拥有一个继承自ABFRealmMapView的属性) enter image description here

但不幸的是,这不起作用!问题是为什么?????

我尝试按如下方式设置PVParkMapViewController的委托(请参阅下面的注释行代码)。 enter image description here

但是放置委托(即取消上面的那一行)会使PVParkMapViewController正常工作 - 但不幸的是,ABFRealmMapView代理都不会再工作了。因此,我不明白这里发生的任何事情或其他事情。

任何帮助表示赞赏!目标是让ABFRealmMapView和PVParkMapViewController的所有代表都工作!

1 个答案:

答案 0 :(得分:0)

......我花了一段时间 - 但我发现了错误:

确实,在PVParkMapViewController中设置mapView-delegate是绝对必要的!即在内部执行以下操作 - (void)viewDidLoad:

[self.mapView setDelegate:self];

或更新的写作风格:

self.mapView.delegate = self;

事实证明,通过这样做,所有ABFRealmMapView代理仍然工作,他们都调用外部代表!实际上,事实证明,通过设置上述内容,所有ABFRealmMapView委托方法都调用PVParkMapViewController的external-delegate-method实现(即它们偏离PVParkMapViewController委托)。

令我感到困惑的是,Annotation-Views也受到委托 - 外部门限偏差的影响!因此(错误地)我认为ABFRealmMapView的原始代表不会全部工作(但实际上,它们也只是偏离了......)!

无论如何,既然ABFRealmMapView和PVParkMap都有自己的Annotation-Views,你总是可以决定是否要进一步偏离externalDelegate-method。

在这里,我很快就让初始委托做了事情(在ABFRealmMapView.m中),而不是通过临时将externalDelegate设置为nil来进一步委托给externalDelegate。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // KOS: temporarily save external-delegate since for the annotationView we do not want to use the external one but the ABFClusterAnnotationView !
    id<MKMapViewDelegate>tempDelegate  = self.externalDelegate;
    // KOS: set the externalDelegate temporarily to nil in order to deviate to ABFAnnotation below....
    self.externalDelegate = nil;

    id<MKMapViewDelegate> delegate = self.externalDelegate;

    if ([delegate respondsToSelector:@selector(mapView:viewForAnnotation:)]) {

        return [delegate mapView:mapView viewForAnnotation:annotation];
    }
    else if ([annotation isKindOfClass:[ABFAnnotation class]]) {

        // KOS: set back the externalDelegate for further use in other delegate-methods
        self.externalDelegate = tempDelegate;
        ABFAnnotation *fetchedAnnotation = (ABFAnnotation *)annotation;

        ABFClusterAnnotationView *annotationView = (ABFClusterAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ABFAnnotationViewReuseId];

        if (!annotationView) {
            annotationView = [[ABFClusterAnnotationView alloc] initWithAnnotation:fetchedAnnotation
                                                                  reuseIdentifier:ABFAnnotationViewReuseId];
            annotationView.canShowCallout = YES;
        }

        annotationView.count = fetchedAnnotation.safeObjects.count;
        annotationView.annotation = fetchedAnnotation;

        return annotationView;
    }

    // KOS: set back the externalDelegate for further use in other delegate-methods
    self.externalDelegate = tempDelegate;

    return nil;
}