2011-02-09 103 views
9

我正在为iPhone构建基于MapKit的应用程序。是否可以继承MKPolyline

我有一些MKPolylines添加到地图。

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

问题是,我无法找到从MKPolyline继承的方式,因为它没有任何可以从子类'init调用的init方法。您只能使用便捷方法创建它们。

如何汇总模型属性和MKPolyline行为?

回答

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 2011-03-03 23:16:56

+0

有一种方法可以设置MKPolyline的子类上的坐标,这里是一个代码片段... MyPolyline * myPolyline =(MyPolyline *)[MyPolyline polylineWithCoordinates:coordinates count:coordinateCount]; – 2011-03-04 14:25:21

2

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

今天我有同样的问题,但想出了其他解决方案。我没有使用韦恩关联的对象属性提示,而是将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),并在同一时间,我可以用它做任何事情,拥有尽可能多的特性。

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] 

上面不会工作,因为仅polylineWithCoordinatesMKPolyline对象分配存储器,而不是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 
相关问题