MKPolyline -> NSKeyedArchiver -> NSData SIGABRT

4

我的应用程序中,我正在尝试将MKPolylines数组存储到NSUserDefaults中。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:overlays];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"theKey"];

提供:

[MKPolyline encodeWithCoder:]: unrecognized selector sent to instance 0x169c20`
Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-
[MKPolyline encodeWithCoder:]: unrecognized 
selector sent to instance 0x1c57e0'

编辑:我取得了一些进展。MKPolylineView符合NSCoding协议,因此我已将我的MKPolyline数组转换为MKPolylineView数组。问题在于,当我想要稍后将它们添加回地图时,我无法将它们转换回MKPolyline。有什么办法吗?

代码崩溃在这里:

NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"theKey"];
NSArray* overlays = [NSKeyedUnarchiver unarchiveObjectWithData:data];

for(MKPolylineView* a in overlays)
    [mapView addOverlay:a.overlay];

2011-10-17 21:15:56.416 Trail Tracker[4269:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x34b2f8bf 0x36c3a1e5 0x34a8420f 0x35697595 0x6257 0x62db 0x365f77ff 0x36601d53 0x36601cc1 0x366a1339 0x366a014f 0x366fad97 0x649b 0x36671565 0x366e9ce7 0x31fcc943 0x34b03a63 0x34b036c9 0x34b0229f 0x34a854dd 0x34a853a5 0x351f9fed 0x365ec743 0x2c75 0x2c34)
terminate called throwing an exception(gdb) 
2个回答

3
我不太确定,但MKPolylines是由CLLocationCoordinate2D数组制成的,其中包含了纬度和经度的浮点值。
因此,如果您可以将这个CLLocationCoordinate2D数组转换为字典数组,那么您就可以将这些线保存在用户默认设置中。
您可以像下面这样做:
MKMapPoint *points = overlays.points;

NSMutableArray *temp = [NSMutableArray array];
for(int i = 0; i < points.length; i++)
{
    // Not sure for this part
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:points[i].x], @"x", [NSNumber numberWithFloat:points[i].y], @"y", nil];
    [temp addObject:dict];
}

那么您可以使用这个数组将覆盖点存储在NSUserDefaults中,像这样:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:temp];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"theKey"];

0

从继承层次结构NSObject -> MKShape -> MKMultiPoint -> MKPolyline来看,它们都没有符合NSCoding协议的要求。因此,您可以考虑继承MKPolyline并包含NSCoding协议,并实现所需的方法,然后使用它。


仅从类的外观来看,MKPolylineView似乎具有一个名为“polyline”的属性,它是一个只读的MKPolyline。我希望这可以为您提供一个Polyline,从而得到一个polylineview。 - Saran
是的,我看了那个,感到充满希望的灵感...直到我尝试使用它并发现在某个地方,折线属性在翻译(字面上)中丢失了,尽管有mkpolylineviews,但相应的折线属性为nil。 - eric.mitchell
一旦我有可用的计算机,我就可以发布代码和具体的错误报告。 - eric.mitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接