0

カスタム MKAnnotation クラス MapLocation を作成しました。MKAnnotationView を作成するこの方法を除いて、プロパティの設定や取得に問題はありません。注釈のインデックスから場所の種類を検索し、annotationView のカスタム注釈画像のファミリの 1 つを選択することになっているため、ここでそれを行う必要があります。

MapLocation.h と .m でカスタムのゲッターとセッターを設定しようと何度も試みた後、(必須の) ゲッター、タイトルをコピーすることさえできず、タイトルを title2 に名前を変更し、その戻り値を取得しようとすることさえできないところまで煮詰めました。 . これは私のコードです:

-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *placemarkIdentifier=@"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のドキュメントを見ましたが、おそらくそれを宣言する方法がわからないので、このメソッドはそれを認識しています。title ゲッターが表示されるのに、title2 コピーが表示されないのは奇妙です。

4

1 に答える 1

3

行をドット表記からこれに変更してみてください:

NSString *str2=[annotation title2];

エラーは消えるはずです。

何が起こっているかというと、アノテーションがMKAnnotation. 他にどのような方法があるかを知っているという事実は関係ありません。コンパイラはサイキックではありません。コンパイラが知っているのは、注釈が MKAnnotation プロトコルに従うことだけです。タイトル ゲッターが表示される理由は、タイトルが MKAnnotation で定義されているためです。

キャストを使用してこれを修正することもできます。

MapLocation *mapLocation = (MapLocation *)annotation;

今、あなたは言うことができます

NSString *str2=mapLocation.title2;

mapLocation が MapLocation オブジェクトであることをコンパイラに伝えたからです。

于 2010-05-18T14:48:27.233 に答える