Я пытался кодировать центр MKMapView
и охватывать NSKeyedArchiver
для сохранения состояния. Я нашел пару полезных новых дополнений MapKit NSValue
, valueWithMKCoordinate:
и valueWithMKCoordinate:
. Попытка кодировать их в шпоночным архиватора не удалось:Почему я не могу кодировать NSValue в NSKeyedArchiver?
- (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: в]: этот архиватор не может кодировать Структуры'
Я понимаю, что решение этой проблемы состоит в том, чтобы просто закодировать отдельные дубликаты на четыре отдельных ключа.
Мой вопрос: Почему это происходит. 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