Описанные здесь до сих пор не совсем сработали для меня, но мне удалось найти решение, основанное на других ответах и некоторых независимых исследованиях. Я не на 100% уверен в этом, но вы можете использовать MKPolyline в пользовательский подкласс только, если вы используете вызов статического метода, который внутренне вызывает правильный метод init.
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
выше не будет работать, так как polylineWithCoordinates
только выделяет память для MKPolyline
объекта, а не CustomPolyline
. Я подозреваю, что происходит внутри, так это то, что polylineWithCoordinates
вызывает другой метод инициализации способом, похожим на: [MKPolyline otherInitMethod:...]
. И он не выделяет надлежащий объем памяти, потому что теперь он использует статический вызов MKPolyline
, а не статический вызов 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
Проблема с этим состоит в том, что тогда нет способа установить координаты, так как координаты являются свойствами readonly и могут быть установлены только методом удобства. Я тоже надеялся подклассировать MKPolyline, просто добавить в него часть информации, но, похоже, я не могу этого сделать. – GendoIkari
Существует способ установить координаты в подклассе MKPolyline, вот фрагмент кода ... MyPolyline * myPolyline = (MyPolyline *) [MyPolyline polylineWithCoordinates: count count: coordCount]; –
polylineWithCoordinates всегда возвращает MKPolyline ... он никогда не вернет MyPolyline. Таким образом, даже если вы делаете это так, все, что вы делаете, говорит компилятору, что это MyPolyline. В памяти это все равно будет MKPolyline. – GendoIkari