2015-11-08 78 views
0

使用iOS-v9.1,XCode-v7.1:ABFRealmMapView代表混淆

我的mapView的委託方法還沒有工作。

以下適用:

  • MapView的屬性的類型的ABFRealmMapView enter image description here
  • ABFRealmMapView是從的MKMapView繼承 enter image description here
  • ABFRealmMapView具有externalDelegate定義如下的類: enter image description here
  • 當地圖疊加發生時,renderForOverlay委託方法是正確執行: enter image description here
  • 的想法是,這實現還調用父類PVParkMapView代表團法「renderForOverlay」(因爲這一個擁有來自ABFRealmMapView繼承的財產) enter image description here

但不幸的是這不起作用!問題是爲什麼?????

我試着按如下方式設置PVParkMapViewController的委託(參見下面的代碼行)。 enter image description here

但把委託(即uncomenting上面的線)將使PVParkMapViewController正常工作 - 但不幸的是,沒有一個ABFRealmMapView代表將不再工作。所以我不明白在這裏發生的一件事或一件事。

任何幫助表示讚賞!目標是讓ABFRealmMapView和PVParkMapViewController的所有委託工作!

回答

0

...我花了一段時間 - 但我發現的錯誤:

事實上,設定的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; 
} 
+1

你的「修復」工作,但預期的用途是,如果你設置'ABFRealmMapView'的委託,然後實現在委託的方法之一,那麼它會默認使用該方法與實施其內部處理。 邏輯是,既然你實現了這個方法,你就可以自己返回'viewForAnnotation:'比如允許'ABFRealmMapView'提供它的默認視圖。 如果您沒有實現'mapView:viewForAnnotation:'但只有其他委託方法,'ABFRealmMapView'仍然會使用默認視圖進行註釋。 –

+0

注行: '如果([委託respondsToSelector:@selector(MapView類:viewForAnnotation :)]){'如果 您的委託實現這種方法,那麼它將檢索從實施註釋的觀點,與使用在'ABFRealmMapView'方法中的實現。 因此,我認爲你不需要對委託邏輯做任何事情....只是不要在'PVParkMapViewController'中實現'mapView:viewForAnnotation:'。 –