MKPolyline -> NSKeyedArchiver -> NSData SIGABRT

Posted

技术标签:

【中文标题】MKPolyline -> NSKeyedArchiver -> NSData SIGABRT【英文标题】: 【发布时间】:2011-12-03 15:05:33 【问题描述】:

在我的应用程序中,我试图将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 协议,因此我将MKPolylines 数组转换为MKPolylineViews 数组。问题是当我想稍后将它们添加回地图时,我无法将它们转换回MKPolylines。知道该怎么做吗?

在此代码处崩溃:

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) 

【问题讨论】:

【参考方案1】:

我对此不太确定,但 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"];

【讨论】:

【参考方案2】:

通过查看继承层次结构 NSObject -> MKShape -> MKMultiPoint -> MKPolyline 它们都不符合 NSCoding 协议。所以,你可以考虑继承 MKPolyline 并包含 NSCoding 协议并实现所需的方法并使用它。

【讨论】:

只看这个类,它看起来 MKPolylineView 有一个属性'polyline',一个只读的 MKPolyline。我希望这应该给你一个折线视图中的折线。 是的,我看到了,充满希望……直到我尝试使用它并发现某处,折线属性在翻译(字面意思)中丢失了,尽管有mkpolylineviews,对应的折线属性为nil。 一旦我有一台可用的计算机,我就可以发布代码和具体的错误报告

以上是关于MKPolyline -> NSKeyedArchiver -> NSData SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

将 MKTileOverlay 与 MKPolyLine 一起使用

iOS 3 中 MKPolyline 的等价物

与 MapKit 中的缩放相关的 MKPolyline 奇怪渲染

在 MKPolyLine 视图中绘制渐变

MapKit:添加 MKPolyline 隐藏 MKTileOverlay

使用 MKPolyline 在地图上绘制用户路线