Những gì được đề cập ở đây cho đến nay vẫn chưa hoàn toàn phù hợp với tôi nhưng tôi đã quản lý một giải pháp dựa trên các câu trả lời khác và một số nghiên cứu độc lập. Tôi không chắc chắn 100% trong điều này nhưng bạn có thể bỏ một MKPolyline thành một lớp con tùy chỉnh chỉ nếu bạn sử dụng lệnh gọi phương thức tĩnh gọi phương thức 'init' bên trong.
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
trên sẽ không làm việc vì polylineWithCoordinates
chỉ cấp phát bộ nhớ cho một đối tượng MKPolyline
và không CustomPolyline
. Tôi nghi ngờ những gì đang xảy ra bên trong là polylineWithCoordinates
gọi phương thức khởi tạo khác theo cách tương tự như: [MKPolyline otherInitMethod:...]
. Và nó không phân bổ số lượng bộ nhớ thích hợp bởi vì nó hiện đang sử dụng một cuộc gọi phương thức tĩnh MKPolyline
và không phải là cuộc gọi tĩnh CustomPolyline
của chúng tôi.
Tuy nhiên nếu chúng ta sử dụng
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
Nó không làm việc. Tôi nghĩ rằng điều này là do polylineWithPoints
đang sử dụng trình khởi tạo trả về một id
không chỉ là chuỗi cuộc gọi phương thức khác. Và vì chúng tôi đã gọi nó bằng cách sử dụng lớp CustomPolyline
trình khởi tạo phân bổ bộ nhớ cho CustomPolyline
không phải MKPolyline
.
Tôi có thể hoàn toàn sai về lý do tại sao nó hoạt động. Nhưng tôi đã thử nghiệm này và nó có vẻ làm việc tốt. MKPolygon
có thể được mở rộng theo cách tương tự. Trong trường hợp đó tôi nghĩ rằng phương pháp tĩnh đúng để sử dụng là MKPolygon polygonWithCoordinates:points count:pointSet.count]]
thực hiện của tôi để tham khảo:
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 Vấn đề
#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
với đó là không có cách nào để đặt tọa độ, vì tọa độ là thuộc tính chỉ đọc và chỉ có thể được đặt bằng phương thức tiện lợi. Tôi cũng đã hy vọng phân lớp MKPolyline, chỉ để thêm một phần thông tin vào nó, nhưng có vẻ như tôi không thể làm điều này. – GendoIkari
Có một cách để đặt tọa độ trên một phân lớp của MKPolyline, đây là đoạn mã ... MyPolyline * myPolyline = (MyPolyline *) [MyPolyline polylineWithCoordinates: coordinate count: coordinateCount]; –
polylineWithCoordinates luôn trả về MKPolyline ... nó sẽ không bao giờ trả về MyPolyline. Vì vậy, ngay cả khi bạn cast nó như thế, tất cả các bạn đang làm là nói với trình biên dịch rằng nó là một MyPolyline. Trong bộ nhớ nó vẫn sẽ thực sự là một MKPolyline. – GendoIkari