是否有可能从MKPolylineinheritance

我正在为iPhone构build一个基于MapKit的应用程序。

我有一些MKPolylines添加到地图。

然而,我不希望有一个MKPolyline,我想我自己的模型类符合MKOverlay协议添加到地图,以便我可以访问模型属性时,在mapView:viewForOverlay创build相应的视图。

问题是,我找不到从MKPolylineinheritance的方式,因为它没有任何可以从子类“init”调用的init方法。 您只能使用便利的方法创build它们。

我如何将模型属性和MKPolyline行为结合在一起?

您可以设置类的关联对象属性 。 这使您可以将实例variables绑定到现有的类。 确保你自己清理完毕。

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 

希望能帮助别人。

确实,MKPolyline没有自己的init方法。 实际上,具有init方法的MKPolylineinheritance链中唯一的类是NSObject。

所以当我subclassed MKPolyline我只是覆盖NSObject定义的init方法…

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

那么当你想用坐标实例化你的子类时,你可能会这样做…

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

更新:还有另一个select(可能会更好)使用此消息转发(如-forwardingTargetForSelector或东西)。

我今天有同样的问题,但想出了其他解决scheme。 我只是将MKPolyline封装在另一个类中,并将MKOverlay协议的消息传递给它,而不是使用Wayne关联的对象属性的东西。

所以我有类似于.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 ),同时我可以做任何事情,拥有尽可能多的属性,我需要。

到目前为止提到的东西对我来说还没有很好的解决,但是我根据其他的答案和一些独立的研究来pipe理了一个解决scheme。 我不是100%确定的,但是只有当你使用静态方法调用,在内部调用正确的“init”方法时,才能将MKPolyline转换为自定义的子类。

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

以上将无法正常工作,因为polylineWithCoordinates只为MKPolyline对象分配内存,而不是CustomPolyline 。 我怀疑内部发生了什么事, polylineWithCoordinates以类似于[MKPolyline otherInitMethod:...]的方式调用另一个初始化方法。 而不是分配适当数量的内存,因为它现在使用一个MKPolyline静态方法调用,而不是我们的CustomPolyline静态调用。

但是,如果我们使用

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

它确实有效。 我认为这是因为polylineWithPoints正在使用一个初始化,它返回一个id不只是链接到另一个方法调用。 因为我们使用CustomPolyline类调用它, CustomPolyline初始化程序为CustomPolyline分配内存而不是MKPolyline

我可能完全错误,为什么它的作品。 但我已经testing了这个,它似乎工作正常。 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