MKPolyline - > NSKeyedArchiver - > NSData SIGABRT

时间:2011-10-08 16:15:54

标签: ios mkmapview nsuserdefaults nsdata nskeyedarchiver

在我的应用中,我尝试将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 s数组转换为MKPolylineView s数组。问题是,当我想稍后将它们添加回地图时,我无法将它们转换回MKPolyline s。知道怎么做吗?

在此代码崩溃:

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 个答案:

答案 0 :(得分:3)

我不太确定这一点,但MKPolylines是由CLLocationCoordinate2D数组构成的,它包含lat和long的浮点值。

因此,如果您可以将此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"];

答案 1 :(得分:0)

从查看继承层次结构NSObject - &gt; MKShape - &gt; MKMultiPoint - &gt; MKPolyline它们都不符合NSCoding协议。因此,您可以考虑继承MKPolyline并包含NSCoding协议并实现所需的方法并使用它。