2011-10-08 3 views
4

내 응용 프로그램에 의 배열을 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' 

편집 : 나는 일부 진전을했다. MKPolylineViewNSCoding 프로토콜을 준수하므로 배열 MKPolylineViewMKPolyline의 배열을 변환했습니다. 문제는 나중에지도에 다시 추가 할 때 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) 

답변

3

이것에 대해 확신하지 오전하지만 MKPolylines는 위도와 오랫동안 부동 소수점 값을 포함 CLLocationCoordinate2D의 배열에서 만들어집니다.

그래서 CLLocationCoordinate2D 배열을 사전 배열로 변환 할 수 있다면 사용자 기본값에서 해당 줄을 저장할 수 있다고 생각합니다. > MKShape -

당신이

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]; 
} 

처럼 어떤 일을 할 수

그런 다음 당신은 상속 계층 구조 NSObject의보고에서이

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

처럼 nsuserdefaults에 오버레이 포인트를 저장하기 위해이 배열을 사용할 수 있습니다 -> MKMultiPoint -> MKPolyline 그들 중 누구도 NSCoding 프로토콜을 준수하지 않습니다. 따라서 MKPolyline을 계승하고 NSCoding 프로토콜을 포함시키고 필요한 방법을 구현하여이를 사용할 수 있습니다.

+0

편집보기 –

+0

클래스를 보면 MKPolylineView는 읽기 전용 MKPolyline 인 'polyline'속성을 가지고 있습니다. 폴리 라인 뷰에서 폴리 라인을 제공하기를 바랍니다. – Saran

+0

그래, 나는 그것을 보았고 희망에 영감을 얻었다 ... 내가 그것을 사용하려고 할 때까지 폴리 라인 속성이 번역에서 (문자 그대로) 손실되었고 mkpolylineviews가 있었지만 해당 폴리 라인 속성은 무. –