2011-02-09 6 views
9

iPhone用MapKitベースのアプリケーションを構築しています。MKPolylineから継承することは可能ですか

マップに追加されたMKPolylinesの数があります。

しかし、mapView:viewForOverlayで対応するビューを作成するときにモデルプロパティにアクセスできるように、MKPolylineを持つ代わりに、独自のModelクラスをマップに追加したMKOverlayプロトコルに準拠させたいと思います。

問題は、サブクラスのinitから呼び出せるinitメソッドがないため、MKPolylineから継承する方法が見つからないということです。便利な方法で作成することができます。

モデルのプロパティとMKPolylineの動作をどうやってまとめることができますか?

答えて

4

クラスのset an associated object attributeできます。これにより、インスタンス変数を既存のクラスにバインドすることができます。あなた自身の後にきれいにきれいになることを確認してください

2

MKPolylineには独自のinitメソッドがありません。実際、initメソッドを持つMKPolylineの継承チ​​ェーンの唯一のクラスはNSObjectです。

私はMKPolylineをサブクラス化するときだから私はちょうどNSObjectので定義されたinitメソッドをオーバーライド...

-(id) init { 
    self = [super init]; 
    if(self) { 
     //my initialization here 
    } 
    return self; 
} 

あなたは座標であなたのサブクラスのインスタンスを作成したい場合、あなたはこのような何かを行う可能性があります...

-MyPolyline* myPolyline = (MyPolyline*)[MyPolyline polylineWithCoordinates:coordinates count:coordinateCount]; 
+0

問題ということです座標は読み取り専用のプロパティであり、便利なメソッドでのみ設定できるため、座標を設定する方法はありません。私もMKPolylineをサブクラス化したいと考えていましたが、それに情報を追加するだけでしたが、私はこれを行うことはできません。 – GendoIkari

+0

MKPolylineのサブクラスの座標を設定する方法はありますが、コードスニペットは次のとおりです。 MyPolyline * myPolyline =(MyPolyline *)[MyPolyline polylineWithCoordinates:coordinates count:coordinateCount]; –

+3

polylineWithCoordinatesは常にMKPolylineを返します... MyPolylineを返すことはありません。したがって、たとえそれをキャストしたとしても、それがMyPolylineであることをコンパイラに伝えるだけです。メモリ内ではまだ実際にはMKPolylineになります。 – GendoIkari

2

UPDATE:これにメッセージ転送を使用する別の方法があります(-forwardingTargetForSelectorなど)。

私は今日同じ問題を抱えていましたが、他の解決策が思い浮かびました。 Wayneに関連するオブジェクト属性のものを使う代わりに、別のクラスにMKPolylineをカプセル化し、MKOverlayというプロトコルのメッセージを転送しました。

は、だから私は.hの中のようなものを持っている:

@interface MyOverlay : NSObject <MKOverlay> 
{ 
    MKPolyline* polyline; 
    id object; 
} 

@property (nonatomic, retain) id object; 
@property (nonatomic, retain) MKPolyline* polyline; 

+ (MyOverlay*)myOverlayWithObject: (id)anObject; 

@end 

そして.Mで

@implementation MyOverlay 
@synthesize object; 
@synthesize polyline; 


+ (MyOverlay*)routePartOverlayWithObject: (id)anObject {  

    MyOverlay* myOverlay = [[MyOverlay alloc] init]; 

    ... generating MKPolyline ... 

    myOverlay.polyline = ... generated polyline ...; 
    routePartOverlay.object = anObject; 


    return [myOverlay autorelease]; 
} 

- (void) dealloc { 
    [cdRoutePart release]; cdRoutePart = nil; 
    [polyline release]; polyline = nil; 

    [super dealloc]; 
} 

#pragma mark MKOverlay 
//@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
- (CLLocationCoordinate2D) coordinate { 
    return [polyline coordinate]; 
} 

//@property (nonatomic, readonly) MKMapRect boundingMapRect; 
- (MKMapRect) boundingMapRect { 
    return [polyline boundingMapRect]; 
} 

- (BOOL)intersectsMapRect:(MKMapRect)mapRect { 
    return [polyline intersectsMapRect:mapRect]; 
} 

@end 

のでMyOverlay振る舞うMKPolylineのように(MKOverlayに準拠)と同じ時間Iで私が必要とする多くのプロパティを持って、それで何かをすることができます。

+0

downvoteの人がこの答えで間違ったことを説明できますか? –

7

MANIAK_dobriiのコードを移動するための方法であるが、私はそれを動作させるためにいくつかの追加MKMultiPointメソッドを実装するために、ここで私が使用しAnchorLineクラスのための私の完全なヘッダファイルと実装ファイルですしていたが見つかりました: -

ヘッダーAnchorLineは、 .hの

#import <MapKit/MapKit.h> 

@interface AnchorLine : NSObject <MKOverlay> { 
    MKPolyline* polyline; 
} 

@property (nonatomic, retain) MKPolyline* polyline; 

+ (AnchorLine*)initWithPolyline: (MKPolyline*) line; 
@end 

実装AnchorLine.m

#import "AnchorLine.h" 

@implementation AnchorLine 

@synthesize polyline; 


+ (AnchorLine*)initWithPolyline: (MKPolyline*) line { 
    AnchorLine* anchorLine = [[AnchorLine alloc] init]; 
    anchorLine.polyline = line; 
    return [anchorLine autorelease]; 
} 

- (void) dealloc { 
    [polyline release]; 
    polyline = nil; 
    [super dealloc]; 
} 

#pragma mark MKOverlay 
//@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
- (CLLocationCoordinate2D) coordinate { 
    return [polyline coordinate]; 
} 

//@property (nonatomic, readonly) MKMapRect boundingMapRect; 
- (MKMapRect) boundingMapRect { 
    return [polyline boundingMapRect]; 
} 

- (BOOL)intersectsMapRect:(MKMapRect)mapRect { 
    return [polyline intersectsMapRect:mapRect]; 
} 

- (MKMapPoint *) points { 
    return [polyline points]; 
} 


-(NSUInteger) pointCount { 
    return [polyline pointCount]; 
} 

- (void)getCoordinates:(CLLocationCoordinate2D *)coords range:(NSRange)range { 
    return [polyline getCoordinates:coords range:range]; 
} 

@end 

誰かに役立ちます願っています。

0

これまで述べてきたことは、私にとってはうまくいきませんでしたが、私は他の回答といくつかの独立した研究に基づいて解決策を管理しました。私はこれで100%確実ではありませんが、適切な 'init'メソッドを内部的に呼び出す静的メソッド呼び出しを使用する場合は、のみMKPolylineをカスタムサブクラスにキャストできます。

(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount] 

polylineWithCoordinatesのみMKPolyline対象としないCustomPolylineのためにメモリを割り当てるため、上記動作しません。私は内部的に何が起こっているのだろうと思うのは、polylineWithCoordinates[MKPolyline otherInitMethod:...]のような方法で別の初期化メソッドを呼び出すということです。そして、それは現在、静的メソッド呼び出しを使用しており、私たちのCustomPolyline静的呼び出しを使用していないため、適切な量のメモリを割り当てていません。我々は

(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount]; 

を使用する場合

は、しかしそれは作業を行います。これは、polylineWithPointsが別のメソッド呼び出しにチェーンするだけでなく、idを返すイニシャライザを使用しているからです。 CustomPolylineクラスを使用して呼び出されて以来、イニシャライザはCustomPolylineではなくMKPolylineのメモリを割り当てます。

私はそれがなぜ機能するのか完全に間違っている可能性があります。しかし、私はこれをテストし、それは正常に動作するようです。 MKPolygonも同様の方法で拡張することができます。その場合、私が使用する正しい静的メソッドは、参照のためMKPolygon polygonWithCoordinates:points count:pointSet.count]]

私の実装だと思います。それと

CustomPolyline.h

#import <MapKit/MapKit.h> 

typedef enum { 
    CustomPolylineTypeNone = 0, 
    CustomPolylineDifferentStrokes 
} CustomPolylineType; 

/** 
* CustomPolyline wraps MKPolyline with additional information about a polyline useful for differentiation. 
*/ 
@interface CustomPolyline : MKPolyline 

@property CustomPolylineType type; 

-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline; 

@end 

CustomPolyline.m

#import "CustomPolyline.h" 

@implementation CustomPolyline 

@synthesize type; 

/** 
* Takes an MKPolyline and uses its attributes to create a new CustomPolyline 
*/ 
-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline 
{ 
    // We must use the this specific class function in this manner to generate an actual 
    // CustomPolyline object as opposed to a MKPolyline by a different name 
    return (CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount]; 
} 

@end 
関連する問題