Le cose qui menzionate finora non ha funzionato per me, ma ho gestito una soluzione basata sulle altre risposte e alcune ricerche indipendenti. Non sono sicuro al 100% in questo, ma puoi trasmettere una MKPolyline in una sottoclasse personalizzata solo se si utilizza la chiamata al metodo statico che chiama internamente il metodo "init" corretto.
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
che questo non funzionerà perché polylineWithCoordinates
solo alloca memoria per un oggetto MKPolyline
e non CustomPolyline
. Sospetto che ciò che sta accadendo internamente sia che lo polylineWithCoordinates
chiama un altro metodo di inizializzazione in un modo simile a: [MKPolyline otherInitMethod:...]
. E non sta allocando la giusta quantità di memoria perché ora sta usando una chiamata al metodo statico MKPolyline
e non alla nostra chiamata statica CustomPolyline
.
Tuttavia, se usiamo
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
funziona. Penso che questo sia dovuto al fatto che polylineWithPoints
utilizza un inizializzatore che restituisce un id
non solo concatenando ad un'altra chiamata di metodo. E poiché l'abbiamo chiamato usando la classe CustomPolyline
, l'inizializzatore alloca la memoria per CustomPolyline
non MKPolyline
.
Potrei sbagliarmi completamente sul perché funzioni. Ma ho provato questo e sembra funzionare bene. MKPolygon
può essere esteso in modo simile. In questo caso penso che il metodo statico corretto da utilizzare è MKPolygon polygonWithCoordinates:points count:pointSet.count]]
mia implementazione di riferimento:
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
problema con quello è che non c'è quindi modo di impostare le coordinate, poiché le coordinate sono proprietà di sola lettura e possono essere impostate solo con il metodo di convenienza. Anch'io speravo di sottoclasse MKPolyline, solo per aggiungere un pezzo di informazione ad esso, ma sembra che non possa farlo. – GendoIkari
C'è un modo per impostare le coordinate su una sottoclasse di MKPolyline, ecco uno snippet di codice ... MyPolyline * myPolyline = (MyPolyline *) [MyPolyline polylineWithCoordinates: coordinate count: coordinateCount]; –
polylineWithCoordinates restituisce sempre un MKPolyline ... non restituirà mai MyPolyline. Quindi, anche se lo lanci in quel modo, tutto quello che stai facendo è dire al compilatore che si tratta di una MyPolyline. In memoria sarà ancora effettivamente un MKPolyline. – GendoIkari