2011-10-08 93 views
4

在我的應用程序中,我試圖將MKPolylines的數組存儲到NSUserDefaults中。MKPolyline - > NSKeyedArchiver - > NSData SIGABRT

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 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) 

回答

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協議並實現所需的方法並使用它。

+0

查看我的編輯請 –

+0

通過只查看類看起來MKPolylineView有一個屬性'折線',一個只讀的MKPolyline。我希望應該從polylineview給你一個折線。 – Saran

+0

是的,我看着那個,並且受到了希望的啓發...直到我試圖使用它並發現某處,折線屬性在翻譯時(字面意義上)正在丟失,雖然有mkpolylineviews,但相應的折線屬性是零。 –

相關問題