0

嘿伙计们,我正在制作一个正在运行的应用程序,但在保存我的 MGLMapView 时遇到了麻烦,该视图包含从运行的用户绘制的多条线,在 Core Data 中。我没有收到任何错误,但解码返回一个没有多线段的空 MGLMapView,就好像它刚刚被实例化一样。当用户保存他/她的运行时,它会存储所有信息并将其显示在 tableView 中。我将 mapView 和 pointsArray(其中包含用户创建的所有 CllocationCoordinates2D)存储在名为 mapViewStore 的类中,如您在此处看到的。

我的实体和属性

该类符合 NSCoding,因此它对 mapView 和 pointsArray 的编码和解码没有问题。我不得不分解坐标,因为我无法完整地编码 CllocationCoordinate2D。

import UIKit
import Mapbox
import MapKit
import CoreLocation

class MapViewStore: NSObject, NSCoding {

    var mapView: MGLMapView!
    var pointsArray: [CLLocationCoordinate2D] = []
    var latArray: [Double] = []
    var lonArray: [Double] = []
    init(mapView: MGLMapView, pointsArray: [CLLocationCoordinate2D]) {

        self.mapView = mapView
        self.pointsArray = pointsArray
    }

    required init(coder aDecoder: NSCoder) {
        self.mapView = aDecoder.decodeObject(forKey: "mapView") as? MGLMapView
        self.latArray = aDecoder.decodeObject(forKey: "latArray") as! [Double]
        self.lonArray = aDecoder.decodeObject(forKey: "lonArray") as! [Double]

        for i in 0..<lonArray.count {
            let coordinate = CLLocationCoordinate2D(latitude: latArray[i], longitude: lonArray[i])
            pointsArray.append(coordinate)
        }
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(mapView, forKey: "mapView")

        for i in 0..<pointsArray.count {
            latArray.append(pointsArray[i].latitude)
            lonArray.append(pointsArray[i].longitude)
        }
        aCoder.encode(latArray, forKey: "latArray")
        aCoder.encode(lonArray, forKey: "lonArray")
    }

}

如果我错了,请纠正,但我相信这里发生的是,当我对 MGLMapView 进行编码时,它会将其转换为 NSObject 并丢失所有信息。因此,当我将其转换回 MGLMapView 时,我得到一张空地图。有没有办法避免这种情况?也许存储折线?虽然如果我这样做,我可能会遇到同样的问题。

我可以使用 pointsArray 在 mapView 上重新创建折线,但性能会受到影响。

编辑:对于现在正在观看的人。不要这样做。我想在表格单元格内创建一个 mapView,这是一个非常糟糕的主意。而是拍摄快照并保存图像。我现在只是在学习。

4

1 回答 1

1

更有可能的是,它MGLMapView根本不将折线编码为其NSCoding方法的一部分。UIView符合NSCoding,所以它的所有子类都继承它。但这并不意味着它们都添加了完全编码/解码所需的一切。查看源代码MGLMapView表明它没有实现encodeWithCoder,这几乎可以肯定是解释。

将视图对象保存到数据模型中是非常不寻常的,无论是使用 Core Data 还是任何其他选项。您需要从模型对象重新创建视图状态。那可能是您现有的pointsArray. 它看起来像MGLPolyLine对其 points 进行编码,因此您可以根据需要使用它NSCoding

于 2017-11-22T23:18:03.300 回答