MKMapView
のセンターとスパンを状態保存のためにNSKeyedArchiver
にエンコードしようとしました。私は便利な新しいMapKit NSValue
の追加、valueWithMKCoordinate:
とvalueWithMKCoordinate:
を見つけました。NSKeyedArchiverでNSValueをエンコードできないのはなぜですか?
- (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];
}
がキャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了:失敗したキー付きアーカイバにこれらをエンコードしようとしている ' - [NSKeyedArchiver encodeValueOfObjCType:で:]:このアーカイバエンコードすることができない構造体'
この問題の解決策は、個々のダブルスを4つの別々のキーにエンコードすることだと私は理解しています。
私の質問はなぜになるのですか? NSValue
がオブジェクトであるので、なぜそれが
私は 'NSValue'が' NSData'のようなものをコード化していると仮定していましたが、そのフォーマットを知っていれば他端で解凍できるバイトのストリームです。これは間違っていると思いますか? –
それは間違っていませんが、NSValueはそれをパックしてバイトから/から解凍できるように格納しているデータに関する十分な情報を知りません。 –
@nevankingこれはNSArchiverを使うときには本当に当てはまります。しかし、 'NSKeyedArchiver'は、名前を持つためにデータ項目に追加の要件を置きます。その代わりに、キー付きアーカイバを使用すると、100%同一ではないオブジェクトにアーカイブを保存できます(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Archiving/Articles/compatibility.html#//apple_ref/doc/uid/20001055-BCICFFGE)。 – dasblinkenlight