到目前爲止提到的內容對我而言並不完全適用,但我基於其他答案和一些獨立研究管理了解決方案。我不是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 2011-03-03 23:16:56
有一種方法可以設置MKPolyline的子類上的座標,這裏是一個代碼片段... MyPolyline * myPolyline =(MyPolyline *)[MyPolyline polylineWithCoordinates:coordinates count:coordinateCount]; – 2011-03-04 14:25:21