2014-01-13 24 views
1

我正在使用MKMapView和MKAnnotations在xCode中創建應用程序。如果您製作兩個以上的註釋,則額外的航點顏色(PinAnnotations)應更改爲紫色。在MapView.annotations中獲取MKAnnotation的索引

因此我需要標記,IndexPath或標識中的ID來標識MKAnnotation函數中的MKAnnotation。我用這行代碼:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *pinView = nil; 

    if (annotation != mkMap.userLocation) 
    { 
     static NSString *defaultPinID = @"aPin"; 
     pinView = (MKPinAnnotationView *)[mkMap dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 

     if (pinView == nil) 
     { 
      pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 

      pinView.canShowCallout = YES; 

      pinView.tag = mapView.annotations.count; // tag is not available for annotation in this function 
     } 
    } 

    pinView.canShowCallout = YES; 
    pinView.animatesDrop = YES; 
    pinView.draggable = YES; 


    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return pinView; 

    NSLog(@"Annotation-Index: %d", [mapView.annotations indexOfObject:annotation]); 
    NSLog(@"MapView.annotations.count = %d", mapView.annotations.count); 

    if (1 == [mapView.annotations indexOfObject:annotation]) 
     pinView.pinColor = MKPinAnnotationColorGreen; 
    else if (1 < [mapView.annotations indexOfObject:annotation]) 
    { 

     pinView.pinColor = MKPinAnnotationColorRed; 

     // checkes for extra waypoints 
     if (2 < mapView.annotations.count) 
     { 
      for (int i = 2; i > mapView.annotations.count; i++) 
      { 
       MKPinAnnotationView *aView = [mapView.annotations objectAtIndex:i]; 
       aView.pinColor = MKPinAnnotationColorPurple; 

       [mapView removeAnnotation:mapView.annotations[i]]; 
       NSMutableArray *a = [[NSMutableArray alloc] init]; 
       [a replaceObjectAtIndex:i withObject:aView]; 

       [mapView addAnnotations:a]; 
      } 
     } 
    } 

    return pinView; 
} 

我已谷歌這個問題,並找到了一些解決方案,像我一樣

int AnnotationIndex = [mapView.annotations indexOfObject:annotation]; 

但這個函數的輸出(譯註指數)撞擊我的心靈。有時候一切都很好,但註釋索引具有正確的值,但大多數情況下,值似乎是隨機生成的,並且如果MapView.annotations.count只有3,則比例從0增加到10!

此致敬意!

+0

您可以打印出註釋的標題,以便更好地理解所發生的情況。 ('view.annotation'的標題以及所有'mapView.annotations'的標題) – aforaudrey

+0

您知道,當用戶點擊它時,您的代碼只會在數組中插入註釋嗎? 來自Apple文檔: mapView:annotationView:calloutAccessoryControlTapped: 通知代表用戶點擊其中一個註釋視圖的附件按鈕。 –

+0

對不起,我進入了一個錯誤的例子,並注意到它太晚了,但現在我編輯了它......但你是對的我會嘗試 – user3191334

回答

1

處理此問題的推薦方法是讓您自己的類實現MKAnnotation協議並擁有一個屬性,您可以在viewForAnnotations期間檢查該屬性以查看要使用的顏色。不保證MKMapView的annotations數組的順序可以將註釋添加到地圖中。你可能會加入煩惱,惱怒,然後煩惱,但你可能會回來[anno2,anno3,anno1]。這就是它的方式,你不能改變它。所以,你可以保留自己的註釋陣列,這些註釋不會重新排列。或者使用額外的財產想法,如果適合。

你不應該做的一件事是在viewForAnnotation函數中添加更多的註釋,這真的搞砸了。

+0

聽起來很好,非常感謝你的詳細答案!我會試試看,如果它有效,給你勾號! – user3191334

+0

完美的作品!謝謝! 如果有像我這樣的人遇到了自定義MKAnnotation類的問題 - 這裏有一個鏈接(很簡單): http://blog.flatironschool.com/post/64218319803/creating-custom-map-annotations-using- mkannotation – user3191334