在NSUserDefaults中将MKPolyline保存为NSData

我的iOS应用程序需要在MKPolyline存储NSUserDefault 。 我一直在做很多研究,现在我知道:

  • NSUserDefaults是NSCoder的子类
  • MKPolyline不是NSCoder的子类

因此,将折线保存到nsuserdefaults相当困难。 我试图将MKPolyline转换为NSData:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:routeLine]; // routeLine is an MKPolyline [defaults dataForKey:@"key"]; [defaults synchronize]; 

当我尝试将折线转换为NSData时,我收到以下错误消息:

因未捕获的exception’NSInvalidArgumentException’而终止应用程序,原因:’ – [MKPolyline encodeWithCoder:]:无法识别的选择器发送到实例0xba1fd70

我可以在使用MKPolylineView时成功执行上述代码,但是我遇到了将MKPolyline从View中取回的问题。 我在SO上找到了这个Q / A,但它没有解决我的问题,因为它会改变我的应用程序的运行方式。

如何保存MKPolyline? 我可以将其子类化,如果是这样的话会带来什么? 或者有没有办法用MKPolylineView做到这一点? 我错过了NSCoder的东西吗?

虽然您可以自己为MKPolyline实现NSCoding ,然后构建一个NSData表示并将其存储在NSUserDefaults ,但使用NSUserDefaults可以直接处理的数组和字典表示MKPolyline可能更好。

构造一个字典数组,封装每个点的x和y值,并将其存储在NSUserDefaults而不是MKPolyline

加载默认值时,获取数组,循环重构点的字典,然后重新创建MKPolyline