I was trying to encode an MKMapView
center and span into an NSKeyedArchiver
for state preservation. I found a couple of handy new MapKit NSValue
additions, valueWithMKCoordinate:
and valueWithMKCoordinate:
. Trying to encode these into the keyed archiver failed:
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSValue *mapCenterValue = [NSValue valueWithMKCoordinate:mapView.centerCoordinate];
NSValue *mapSpanValue = [NSValue valueWithMKCoordinateSpan:mapView.region.span];
[coder encodeObject:mapCenterValue forKey:kMapCenter];
[coder encodeObject:mapSpanValue forKey:kMapSpan];
}
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'
I understand that the solution to this problem is to just encode the individual doubles into four separate keys.
My question is why does this happen. An NSValue
is an object, so why is it telling me "this archiver cannot encode structs"
NSValue
encoded its stuff likeNSData
, as a stream of bytes which could be unpacked at the other end if you knew the format. I guess this is wrong? – Overlap