Ich habe versucht, ein MKMapView
Center zu codieren und in eine NSKeyedArchiver
für die Erhaltung des Zustands spannen. Ich fand ein paar handliche neue MapKit NSValue
Ergänzungen, valueWithMKCoordinate:
und valueWithMKCoordinate:
. Der Versuch, diese in die Schlüsselarchivierungs zu kodieren fehlgeschlagen:Warum kann ich keinen NSValue in einem NSKeyedArchiver codieren?
- (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];
}
App beenden aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: '- [NSKeyedArchiver encodeValueOfObjCType: in:]: Der Archivierungs kodieren, kann nicht structs'
Ich verstehe, dass die Lösung für dieses Problem ist, nur die einzelnen Doubles in vier separate Schlüssel zu kodieren.
Meine Frage ist warum geschieht dies. Ein NSValue
ist ein Objekt, also warum ist es mir zu sagen, „dieses Archivierungs kann structs nicht kodieren“
Ich hatte angenommen, dass 'NSValue' seine Dateien wie' NSData' codiert hat, als ein Strom von Bytes, die am anderen Ende entpackt werden könnten, wenn Sie das Format kannten. Ich denke, das ist falsch? –
Es ist nicht falsch, aber NSValue weiß nicht genug Informationen über die Daten, die es speichert, um es in/aus Bytes zu packen und zu entpacken. –
@nevanking Das ist absolut richtig, wenn Sie 'NSArchiver' verwenden."NSKeyedArchiver" stellt jedoch eine zusätzliche Anforderung an die Datenelemente, um Namen zu haben. Im Gegenzug ermöglicht der "Keyed Archiver" [das Auslagern von Objekten, die nicht zu 100% identisch sind] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Archiving/Articles/compatibility.html#//apple_ref/doc/uid/20001055-BCICFFGE). – dasblinkenlight