0

カスタム注釈を MKMapView に配置するモジュールに取り組んでいます。現在、私のロジックの多くは、MKAnnotationView を継承するクラスにあります。同じコードをすべて手動でコピーして、MKPinAnnotationView から継承する別のクラスに貼り付けたので、クライアント マップ デリゲートは、デフォルトのピン イメージ/アニメーションが必要かどうかに応じて、いずれかのカスタム サブクラスを使用できます。

このコードの保守とデバッグを容易にするために、このコードを DRY して、両方のカスタム クラスが同じクラスから継承されるようにしたいと考えています。ただし、この継承図を実現するための適切にクリーンなアプローチは見つかりませんでした。

CustomAnnotationView              CustomPinAnnotationView
            \                       /
             \                     /
              V                   V
        CustomBaseAnnotationImplementation
            /                      \
           /                        \
          V                          V
 MKAnnotationView              MKPinAnnotationView

私はこのようなことをしてみました:

#if UsesPinAnnotationView
#define CustomStandInSuperClass MKPinAnnotationView
#else
#define CustomStandInSuperClass MKAnnotationView
#endif

@interface CustomBaseAnnotationViewImplementation : CustomStandInSuperClass

次に、#define UsesPinAnnotationView 0私の CustomPinAnnotationView を挿入しましたが、思ったように機能しませんでした (プリプロセッサが到達した最初の #define を使用し、他の #define を破棄したと思います-最終的には MKAnnotationView サブクラスになりましたすべての場合で、コードは正常にコンパイルされましたが、認識されないセレクター (setAnimatesDrop:) でクラッシュしました。CustomAnnotationView#define UsesPinAnnotationView 1

ObjC ランタイム API を使用して、実行時に共通実装ファイルから具体的なサブクラスにメソッドを追加する方法を研究してきましたが、ここでは実現可能な (または必要な) ソリューションではないようです。

つまり、これは多重継承ではなく、変数継承です。フレームワークの制約を回避することなく実行できるはずのことのようです。何か案は?

4

2 に答える 2

1

その通りです。ランタイムを使ったハッキン​​グなどは、より良いソリューションに適したものとしては良い考えではありません。

継承の代わりに構成を使用することで、再利用可能なすべてのロジックを、各クラスに含まれる別のクラスに分離できます。

CustomAnnotationView              CustomPinAnnotationView
     /      \                        /       \
    /       has a                 has a       \
 is a          V                   V          is a
   \    CustomBaseAnnotationImplementation     /
    \                                         /
     \                                       /
      V                                     V
 MKAnnotationView <----is a -- MKPinAnnotationView

または、慣用的なObjective-Cでこれを行う別の方法は、CustomAnnotationViewおよびCustomPinAnnotationViewの実装にヘッダーをインポートするカスタムロジック/アニメーション/hoo-hahを定義するMKAnnotationViewのカテゴリを使用することです。これは、MKPinAnnotationViewが単なる派手なMKAnnotationViewであるという事実を利用しているため、メソッドは両方のクラスで使用できます。

それは役に立ちますか?

于 2012-10-26T04:31:26.837 に答える
0

プリプロセッサ ディレクティブの 2 つの異なる方法を組み合わせています。

これらのいずれかが機能するはずです。

// Method 1:

#define UsesPinAnnotationView
// or #undef UsesPinAnnotationView

#ifdef UsesPinAnnotationView
#define CustomStandInSuperClass MKPinAnnotationView
#else
#define CustomStandInSuperClass MKAnnotationView
#endif

また

// Method 2:

#define UsesPinAnnotationView (1) // or 0 instead of 1

#if(UsesPinAnnotationView)
#define CustomStandInSuperClass MKPinAnnotationView
#else
#define CustomStandInSuperClass MKAnnotationView
#endif

ただし、これで問題は解決しますが、より良い方法があることに注意してください(@AndrewPouliotが示唆したように、構成は非常に良い選択です)。

于 2012-10-26T04:16:49.057 に答える