0

このコードは MapCallouts デモからのものです。何百もの異なる注釈があったとします。Apple が行った方法では、多くのコードの重複が発生します。

どのクラス インスタンスがデリゲートをトリガーしたかに関係なく、デリゲートをトリガーしたクラスのインスタンスの注釈プロパティにアクセスしたいと考えています。

各注釈を処理し、1 つのユニバーサル メソッドを持つ if ステートメントを記述するよりも簡単な方法はありますか?

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        // if it's the user location, just return nil.
        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;

        // handle our two custom annotations
        //
        if ([annotation isKindOfClass:[BridgeAnnotation class]]) // for Golden Gate Bridge
        {
            //do something   
        }
        else if ([annotation isKindOfClass:[SFAnnotation class]])   // for City of San Francisco
        {
            //do something
        }

        return nil;
    }
4

1 に答える 1

1

のような共通のメソッドをすべてのアノテーション クラスに提供させることができます-annotationView。共通のスーパークラスからすべての注釈クラスを派生させるか、単にプロトコルを作成することができます。次に、アノテーションが実際にセレクターに応答するか、共通クラスのサブクラスであることを確認し、そのビューを要求します。

if ([annotation respondsToSelector:@selector(annotationView)]) {
    return [annotation annotationView];
}

また

if ([annotation isKindOfClass:[AbstractAnnotation class]]) {
    return [annotation annotationView];
}

そうしない理由の 1 つは、注釈として使用するオブジェクトがデータ モデルの一部であることが多く、注釈ビューについて何も知らない可能性があるためです。タイトル、サブタイトル、および場所を提供できることは 1 つのことです。ビューの実際のインスタンスを提供することは、多くの場合、モデル オブジェクトが行うべきことの範囲外です。

注釈ビューは、通常、画像を表示し、吹き出しビューに左右のアクセサリを提供する以外にはあまり機能しないことに注意してください。何百もの異なる注釈ビュー サブクラスが必要になる可能性は本当にありますか? または、すべての注釈に共通の注釈ビューを使用して、それらを別の方法で構成することはできますか (注釈ビューの画像を変更するなど)。

于 2011-04-13T21:30:59.500 に答える