nev*_*ing 7 cocoa objective-c mapkit nsvalue uikit-state-preservation
我试图对一个MKMapView中心进行编码并跨越一个NSKeyedArchiver状态保存.我找到了几个方便的新MapKit NSValue添加,valueWithMKCoordinate:和valueWithMKCoordinate:.尝试将这些编码到密钥存档器中失败:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSKeyedArchiver encodeValueOfObjCType:at:]:此归档程序无法对结构进行编码
我知道这个问题的解决方案是将单个双打编码为四个单独的密钥.
我的问题是为什么会发生这种情况.一个NSValue是一个对象,为什么它告诉我"这个归档器不能编码结构"
根据该NSKeyedArchiver课程的文档,
键控存档与非键控存档的不同之处在于,编码到存档中的所有对象和值都有给定的名称或键。
为了归档 a 的元素struct并为其提供密钥,NSKeyedArchiver需要元数据来了解 a 的每个字段的struct位置以及这些字段的名称是什么。存储@encode的 withNSValue为它提供了有关 a 布局的足够信息struct,但缺少有关每个字段名称的信息。
由于 a 中没有关于字段名称的元数据struct,因此不可能以确保正确取消归档的方式归档数据。这就是为什么NSKeyedArchiver必须拒绝NSValue使用嵌入式 C进行归档struct。
| 归档时间: |
|
| 查看次数: |
2674 次 |
| 最近记录: |