Lo que he mencionado aquí hasta ahora no me ha funcionado del todo, pero logré una solución basada en las otras respuestas y en algunas investigaciones independientes. No estoy 100% seguro de esto, pero puede convertir un MKPolyline en una subclase personalizada solo si utiliza la llamada al método estático que llama internamente al método 'init' correcto.
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
Lo anterior no funcionará porque polylineWithCoordinates
solamente asigna memoria para un objeto MKPolyline
y no CustomPolyline
. Sospecho que lo que sucede internamente es que polylineWithCoordinates
llama a otro método de inicialización de una manera similar a: [MKPolyline otherInitMethod:...]
. Y no asigna la cantidad adecuada de memoria porque ahora está utilizando una llamada de método estático MKPolyline
y no nuestra llamada estática CustomPolyline
.
Sin embargo, si usamos
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
No funciona. Creo que esto se debe a que polylineWithPoints
está utilizando un inicializador que devuelve id
no solo encadenando a otra llamada de método. Y como lo llamamos usando la clase CustomPolyline
, el inicializador asigna memoria para CustomPolyline
, no MKPolyline
.
Podría estar completamente equivocado sobre por qué funciona. Pero probé esto y parece funcionar bien. MKPolygon
se puede extender de una manera similar. En ese caso, creo que el método estático correcto a utilizar es MKPolygon polygonWithCoordinates:points count:pointSet.count]]
Mi aplicación para referencia:
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 esto es que entonces no hay forma de establecer las coordenadas, ya que las coordenadas son una propiedad de solo lectura y solo se pueden configurar por el método de conveniencia. Yo también esperaba subclasificar a MKPolyline, solo para agregarle una información, pero parece que no puedo hacer esto. – GendoIkari
Hay una manera de establecer las coordenadas en una subclase de MKPolyline, aquí hay un fragmento de código ... MyPolyline * myPolyline = (MyPolyline *) [MyPolyline polylineWithCoordinates: coordinates count: coordinateCount]; –
polylineWithCoordinates siempre devuelve una MKPolyline ... nunca devolverá una MyPolyline. Entonces, incluso si lo lanzas así, todo lo que estás haciendo es decirle al compilador que es MyPolyline. En memoria, seguirá siendo una MKPolyline. – GendoIkari