Est-il possible d'hériter de MKPolyline

Je construis une application basée sur MapKit pour iPhone.

J'ai un certain nombre de MK Polylines ajoutées à la carte.

Cependant, au lieu d'avoir un MKPolyline, je voudrais avoir ma propre class Model conforme au protocole MKOverlay ajouté à la carte afin que je puisse accéder aux propriétés du model lors de la création de la vue correspondante dans mapView: viewForOverlay.

Le problème est que je n'arrive pas à find le moyen d'hériter de MKPolyline car il ne possède aucune méthode init que je puisse appeler à partir de la sous-class 'init. Vous ne pouvez les créer qu'en utilisant les methods de commodité.

Comment puis-je rassembler les propriétés du model et le comportement MKPolyline?

    Vous pouvez définir un atsortingbut d'object associé de la class. Cela vous permet de lier une variable d'instance à une class existante. Assurez-vous de bien nettoyer après vous.

    Le code de MANIAK_dobrii est le path à suivre mais j'ai trouvé que je devais implémenter des methods MKMultiPoint supplémentaires pour le faire fonctionner, voici mes files complets d'en-tête et d'implémentation pour une class AnchorLine que j'ai utilisée: –

    En-tête AnchorLine.h

    #import <MapKit/MapKit.h> @interface AnchorLine : NSObject <MKOverlay> { MKPolyline* polyline; } @property (nonatomic, retain) MKPolyline* polyline; + (AnchorLine*)initWithPolyline: (MKPolyline*) line; @end 

    Implémentation 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 

    J'espère que ça aide quelqu'un.

    Il est vrai que MKPolyline n'a pas sa propre méthode init. En fait, la seule class de la string d'inheritance de MKPolyline qui possède une méthode init est NSObject.

    Donc, quand j'ai sous-classé MKPolyline je viens de replace la méthode init définie par NSObject …

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

    Ensuite, lorsque vous souhaitez instancier votre sous-class avec des coordonnées, vous pouvez faire quelque chose comme ça …

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

    UPDATE: Il y a une autre option (pourrait être mieux) pour utiliser le transfert de message pour cela (comme -forwardingTargetForSelector ou d'autres choses).

    J'ai eu le même problème aujourd'hui mais j'ai trouvé une autre solution. Au lieu d'utiliser des trucs d'attributes d'objects associés à Wayne, j'ai simplement encapsulé MKPolyline dans une autre class et transféré les messages du protocole MKOverlay .

    J'ai quelque chose comme dans .h:

     @interface MyOverlay : NSObject <MKOverlay> { MKPolyline* polyline; id object; } @property (nonatomic, retain) id object; @property (nonatomic, retain) MKPolyline* polyline; + (MyOverlay*)myOverlayWithObject: (id)anObject; @end 

    Et en .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 

    Donc, MyOverlay se comporte comme MKPolyline (conforme à MKOverlay ) et en même time je peux faire n'importe quoi, ayant autant de propriétés que j'ai besoin.

    Ce qui a été mentionné jusqu'ici n'a pas vraiment fonctionné pour moi mais j'ai réussi une solution basée sur les autres réponses et quelques searchs indépendantes. Je ne suis pas sûr à 100%, mais vous pouvez transformer un MKPolyline en une sous-class personnalisée uniquement si vous utilisez l'appel de méthode statique qui appelle la bonne méthode 'init' en interne.

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

    Ce qui précède ne fonctionnera pas car polylineWithCoordinates n'alloue de la memory que pour un object MKPolyline et non pour CustomPolyline . Je suspecte que ce qui se passe en interne est que polylineWithCoordinates appelle une autre méthode d'initialisation d'une manière similaire à: [MKPolyline otherInitMethod:...] . Et ce n'est pas allouer la bonne quantité de memory car c'est maintenant en utilisant un appel de méthode statique MKPolyline et pas notre CustomPolyline statique CustomPolyline .

    Cependant si nous utilisons

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

    Ça marche. Je pense que c'est parce que polylineWithPoints utilise un initialiseur qui returnne un id non seulement en chaînage avec un autre appel de méthode. Et puisque nous l'avons appelé en utilisant la class CustomPolyline l'initialiseur alloue de la memory pour CustomPolyline pas MKPolyline .

    Je pourrais me tromper complètement sur la raison pour laquelle cela fonctionne. Mais j'ai testé cela et cela semble fonctionner correctement. MKPolygon peut être étendu de manière similaire. Dans ce cas, je pense que la méthode statique correcte à utiliser est MKPolygon polygonWithCoordinates:points count:pointSet.count]]

    Ma mise en œuvre pour reference:

    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 atsortingbutes 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