You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:53