To, co tu dotąd wspominałem, nie sprawdziło się, ale udało mi się znaleźć rozwiązanie oparte na innych odpowiedziach i kilku niezależnych badaniach. Nie jestem w 100% pewien tego, ale możesz rzucić MKPolyline w niestandardową podklasę tylko, jeśli używasz statycznego wywołania metody, która wewnętrznie wywołuje właściwą metodę "init".
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
Powyższe nie będzie działać, ponieważ polylineWithCoordinates
tylko przydziela pamięć dla obiektu MKPolyline
i nie CustomPolyline
. Podejrzewam, że wewnętrznie dzieje się tak, że polylineWithCoordinates
nazywa inną metodę inicjalizującą w sposób podobny do: [MKPolyline otherInitMethod:...]
. I nie przypisuje odpowiedniej ilości pamięci, ponieważ teraz używa statycznego wywołania metody, a nie naszego statycznego wywołania CustomPolyline
.
Jednak jeśli używamy
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
To działa. Myślę, że to dlatego, że polylineWithPoints
używa inicjalizatora, który zwraca id
nie tylko łańcuchowe do innego wywołania metody. A ponieważ wywoływaliśmy go przy użyciu klasy CustomPolyline
inicjator przydziela pamięć dla CustomPolyline
, a nie MKPolyline
.
Mogę się mylić, dlaczego to działa. Ale testowałem to i wygląda na to, że działa dobrze. MKPolygon
może zostać przedłużony w podobny sposób. W tym przypadku myślę, że właściwa metoda statyczna w użyciu jest MKPolygon polygonWithCoordinates:points count:pointSet.count]]
Moja implementacja dla odniesienia:
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
Problem z tym jest to, że nie ma wtedy możliwości ustawienia współrzędnych, ponieważ współrzędne są właściwością tylko do odczytu i można je ustawić tylko za pomocą metody wygody. Ja także liczyłem na podklasę MKPolyline, tylko po to, żeby dodać do niej informację, ale wygląda na to, że nie mogę tego zrobić. – GendoIkari
Istnieje sposób ustawiania współrzędnych na podklasie MKPolyline, tutaj jest fragment kodu ... MyPolyline * myPolyline = (MyPolyline *) [Polilinia MyPolylineWith Współrzędne: współrzędne liczba: coordinateCount]; –
polylineWithCoordinates zawsze zwraca MKPolyline ... nigdy nie zwróci MyPolyline. Więc nawet jeśli rzucisz to w ten sposób, wszystko, co robisz, mówi kompilatorowi, że jest to MyPolyline. W pamięci nadal będzie to MPPolyline. – GendoIkari