これまで述べてきたことは、私にとってはうまくいきませんでしたが、私は他の回答といくつかの独立した研究に基づいて解決策を管理しました。私はこれで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
問題ということです座標は読み取り専用のプロパティであり、便利なメソッドでのみ設定できるため、座標を設定する方法はありません。私もMKPolylineをサブクラス化したいと考えていましたが、それに情報を追加するだけでしたが、私はこれを行うことはできません。 – GendoIkari
MKPolylineのサブクラスの座標を設定する方法はありますが、コードスニペットは次のとおりです。 MyPolyline * myPolyline =(MyPolyline *)[MyPolyline polylineWithCoordinates:coordinates count:coordinateCount]; –
polylineWithCoordinatesは常にMKPolylineを返します... MyPolylineを返すことはありません。したがって、たとえそれをキャストしたとしても、それがMyPolylineであることをコンパイラに伝えるだけです。メモリ内ではまだ実際にはMKPolylineになります。 – GendoIkari