如何将实现NSCoding的MKMapCamera等Apple预定义对象存入UserDefaults?
关于MKMapCamera存入UserDefaults的解决方案
当然可以把MKMapCamera这类实现了NSCoding的系统对象存入UserDefaults!你之前尝试扩展重写协议方法没成功,核心原因是MKMapCamera本身已经内置了NSCoding协议的完整实现,根本不需要你手动重写encode和解码逻辑,反而重复实现可能会导致冲突问题。
下面是具体的操作步骤,直接用系统自带的归档/解档能力就能搞定:
一、将MKMapCamera存入UserDefaults
先把相机对象通过NSKeyedArchiver归档成Data类型(UserDefaults支持存储Data),再存入本地:
// 先创建一个示例MKMapCamera实例(实际用你自己的相机对象即可) let targetCamera = MKMapCamera(lookingAtCenter: CLLocationCoordinate2D(latitude: 39.908860, longitude: 116.397390), fromDistance: 1500, pitch: 30, heading: 0) // 归档并存储 do { let cameraData = try NSKeyedArchiver.archivedData(withRootObject: targetCamera, requiringSecureCoding: false) UserDefaults.standard.set(cameraData, forKey: "MySavedMapCamera") // 极端场景下可调用同步确保写入完成(通常无需手动触发) UserDefaults.standard.synchronize() } catch { print("相机归档失败:\(error.localizedDescription)") }
二、从UserDefaults读取MKMapCamera
取出存储的Data后,用NSKeyedUnarchiver解档回MKMapCamera对象:
// 读取存储的Data guard let cameraData = UserDefaults.standard.data(forKey: "MySavedMapCamera") else { print("没有找到存储的相机数据") return } // 解档为MKMapCamera do { if let savedCamera = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(cameraData) as? MKMapCamera { // 成功拿到相机,这里可以直接赋值给地图控件使用 // mapView.camera = savedCamera print("成功读取相机参数:距离\(savedCamera.altitude),朝向\(savedCamera.heading)") } else { print("解档得到的对象不是MKMapCamera类型") } } catch { print("相机解档失败:\(error.localizedDescription)") }
关键注意事项
- 无需手动实现NSCoding:Apple官方框架里的很多类(比如MK系列、UIView、UIColor等)都已经默认实现了NSCoding协议,直接用归档API即可,不要画蛇添足去扩展重写。
- 安全编码参数:如果你的App适配iOS 12及以上,
requiringSecureCoding传false即可,因为MKMapCamera暂时不支持安全编码;如果是iOS 11及更早,直接用旧的NSKeyedArchiver.archivedData(withRootObject:)方法。
内容的提问来源于stack exchange,提问作者3366784
相关产品推荐
相关产品推荐

