2014-02-27 61 views
1

我有一些地方的數組。每個地方都顯示在同一屏幕上的MapView和TableView上。當我點擊表格視圖上相應的行時,我想彈出一個地點的註釋。以編程方式從數組中選擇地圖註釋

我有下面的代碼來填充註釋:

for (int i = 0; i < [self.myPlaces count]; i++) 
    { 
     MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; 
     SPlaces *ev = [self.myPlaces objectAtIndex:i]; 
     point.coordinate = CLLocationCoordinate2DMake([ev.location.latitude doubleValue], [ev.location.longitude doubleValue]); 
     point.title = ev.title; 
     point.subtitle = ev.type.name; 
     [self.myMap addAnnotation:point]; 
    } 

這個代碼,以顯示註釋當在TableView中選擇了行:

//row = tapped row on TableView 
    [self.myMap selectAnnotation:[[self.myMap annotations] objectAtIndex:row] animated:YES]; 

的問題是,註釋似乎在myMap註釋數組中有一個隨機索引。 我的意思是,我想有這種行爲:

users taps row 0 on Table view => annotation of pin 0 pops up on the map 
users taps row 1 on Table view => annotation of pin 1 pops up on the map 
users taps row 2 on Table view => annotation of pin 2 pops up on the map 

但不是這個,我得到:

users taps row 0 on Table view => annotation of pin 1 pops up on the map 
users taps row 1 on Table view => annotation of pin 0 pops up on the map 
users taps row 2 on Table view => annotation of pin 2 pops up on the map 

...或者每個I重啓時間更改任何其他隨機組合應用程序。 請注意,如果我啓用了用戶的位置,我的一個pin註釋可以將其標題隨機更改爲「當前位置」。

我很確定我正在填寫或正確訪問註釋。你有任何線索嗎?

謝謝!

編輯:這篇文章似乎是說,你要掃描您的註解陣列,尋找匹配的標題,然後選擇相應的註解:Open Map Annotation from Selected Row in Table View 這真的是唯一的出路?由於兩個引腳可能共享相同的標題,所以看起來有點危險......

+0

你應該能夠行值分配到註解的'tag'和與之相匹配上,而不是冠軍? – Flexicoder

+0

MKPointAnnotation沒有任何「標籤」屬性。也許我將不得不使用自定義AnnotationView ... –

+0

對不起,我已經使用'MKPinAnnotationView'在過去有標籤。我想知道如果你可以使用'[self.myMap viewWithTag:]'來獲得正確的並且選擇它嗎? – Flexicoder

回答

1

映射視圖的annotations數組不保證按照添加它們的順序返回註釋。

這部分是由於這樣的事實,如果你有showsUserLocation設置爲YES,由地圖視圖返回的annotations陣列包括用戶位置標註,即使你沒有顯式調用addAnnotation它自己。地圖視圖在內部添加了註釋,因此您無法控制訂單。

另一個原因是,文檔沒有說數組將按任何特定的順序。

有關更多詳細信息,請參見MKMapView annotations changing/losing order?


作爲您建議鏈接的答案,一個選項是搜索annotations數組,直到找到您要查找的符合條件的數組。

如果您的註釋類型爲MKPointAnnotation,唯一可用的屬性是title,subtitlecoordinate

如果這些不適用於您(例如,如果您可以使用相同的註釋title),則需要使用具有每個註釋唯一屬性的自定義註記類。


但是,請注意,註釋類不是從底層數據模型類(如SPlaces)不同的類。

它可以簡化問題,如果你的SPlaces實現MKAnnotation協議本身。然後:

  • 您將不需要循環通過self.myPlaces並創建單獨的註釋對象。相反,你將只有一行[self.myMap addAnnotations:self.myPlaces];

  • 您無需搜索地圖視圖的annotations數組即可找到您的SPlaces對象。相反,在didSelectRowAtIndexPath,你將能夠只是這樣做:

    [self.myMap selectAnnotation:[self.myPlaces objectAtIndex:row] 
            animated:YES]; 
    
+0

MKAnnotation協議看起來非常酷,我會嘗試。謝謝 ! –

+0

@Anna我認爲我在某種程度上遇到了與此問題相關的問題。我真的需要有人幫助看看[我的問題](http://stackoverflow.com/questions/28144466/how-to-select-map-pin-when-tapping-table-row-that-associates-with-it )並讓我知道什麼是錯的或我錯過了什麼。我很初學,所以真的需要一些指導。你能幫我解決嗎?謝謝。 – SanitLee