2011-02-09 101 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 
相關問題