2010-05-18 99 views
0

我製作了一個自定義的MKAnnotation類MapLocation。我沒有麻煩設置或獲取屬性,除了在這個方法來創建一個MKAnnotationView。我需要在這裏做,因爲它應該從註解的索引中查找位置類型,併爲annotationView選擇一系列自定義註釋圖像。自定義註釋'訪問未知的getter方法'

經過多次嘗試在MapLocation.h和.m中設置自定義getter和setter,我將它歸結到我無法複製(強制性)getter,title的地方,將其重命名爲title2,並嘗試得到它的回報價值。這是我的代碼:

-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 
static NSString *[email protected]"Map Location Identifier"; 
NSString *str1=annotation.title; 
NSString *str2=annotation.title2; 
if([annotation isKindOfClass:[MapLocation class]]) { 
    MKAnnotationView *annotationView=(MKAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier]; 
    if (annotationView==nil) { 
     annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier]; 
    } 
    else 
     annotationView.annotation=annotation; 


    return annotationView; 
} 
return nil; 

}

4號線,返回正確的標題,但5日線對複製的方法調用產生的主題中的錯誤信息。

我看過XCode文檔,但我可能只是沒有得到如何聲明它,所以這種方法看到它。奇怪的是,它看到標題獲得者,但不是title2副本。

回答

3

嘗試改變線從點符號這樣的:

NSString *str2=[annotation title2]; 

和錯誤應該消失。

發生了什麼事是編譯器已被告知註釋是MKAnnotation。事實上,你知道其他的方法是無關緊要的;編譯器不是通靈的 - 它只知道註釋符合MKAnnotation協議,僅此而已。它看到標題getter的原因是因爲標題是在MKAnnotation中定義的。

您也可以使用強制解決這個問題:

MapLocation *mapLocation = (MapLocation *)annotation; 

現在,你可以說

NSString *str2=mapLocation.title2; 

,因爲你告訴編譯器mapLocation是MapLocation obejct。

+0

當我看到你已經回答時,我實際上正在研究如何聲明MapLocation協議。因此,現在我的註釋有索引,可將它們鏈接到我需要的任何地方,並顯示該類型位置的正確圖像。謝謝! 雖然這並沒有工作(我曾嘗試過):NSString * str2 = [annotation title2]; 它說-title2是未知的。無助於在界面中聲明它。對於像我這樣的新手來說有點奇怪,「因爲編譯器不應該擔心消息,所以它們是運行時的」。我現在明白,如果沒有演員就會抱怨額外的屬性,謝謝! – 2010-05-18 15:42:20