...我花了一段時間 - 但我發現的錯誤:
事實上,設定的MapView-代表在PVParkMapViewController是絕對必要的!即做到以下內 - (無效)viewDidLoad中:
[self.mapView setDelegate:self];
或用較新的寫作風格:
self.mapView.delegate = self;
事實證明,通過這樣做,所有ABFRealmMapView代表仍然工作,他們都調用外部 - 放棄!實際上,事實證明,通過設置上述內容,所有ABFRealmMapView委託方法都會調用PVParkMapViewController的外部委託方法實現(即它們偏離了PVParkMapViewController委託)。
讓我困惑的是,Annotation-Views也受到了這個委託 - 外部交易偏差的影響!因此(錯誤地)我認爲ABFRealmMapView的原始代表不會全部工作(但事實上,他們也只是偏離了...)!
無論如何,由於ABFRealmMapView和PVParkMap都有自己的註釋視圖,您可以隨時決定是否要進一步偏離到externalDelegate方法。
在這裏,我很快地離開了最初的委託做它的事情(在ABFRealmMapView.m內),而不是通過暫時將externalDelegate設置爲零來進一步委託給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;
}
來源
2015-11-09 00:13:43
iKK
你的「修復」工作,但預期的用途是,如果你設置'ABFRealmMapView'的委託,然後實現在委託的方法之一,那麼它會默認使用該方法與實施其內部處理。 邏輯是,既然你實現了這個方法,你就可以自己返回'viewForAnnotation:'比如允許'ABFRealmMapView'提供它的默認視圖。 如果您沒有實現'mapView:viewForAnnotation:'但只有其他委託方法,'ABFRealmMapView'仍然會使用默認視圖進行註釋。 –
注行: '如果([委託respondsToSelector:@selector(MapView類:viewForAnnotation :)]){'如果 您的委託實現這種方法,那麼它將檢索從實施註釋的觀點,與使用在'ABFRealmMapView'方法中的實現。 因此,我認爲你不需要對委託邏輯做任何事情....只是不要在'PVParkMapViewController'中實現'mapView:viewForAnnotation:'。 –