到目前为止提到的内容对我而言并不完全适用,但我基于其他答案和一些独立研究管理了解决方案。我不是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