カスタム注釈を 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 を使用して、実行時に共通実装ファイルから具体的なサブクラスにメソッドを追加する方法を研究してきましたが、ここでは実現可能な (または必要な) ソリューションではないようです。
つまり、これは多重継承ではなく、変数継承です。フレームワークの制約を回避することなく実行できるはずのことのようです。何か案は?