嘿,伙计们,我正在制作一个正在运行的应用程序,我在保存我的MGLMapView时遇到了麻烦,它包含了从用户运行的核心数据中提取的部署线。我没有得到任何错误,但解码返回一个没有部署行的空MGLMapView,就好像它只是被实例化一样。当用户保存他/她的运行时,它会存储所有信息并将其显示在tableView中。我将我的mappview和pointsArray(包含用户创建的所有CllocationCoordinates2D)存储在一个名为mappviewstore的类中,如您所见。
ios - Swift-如何在核心数据中存储MGLMapView以在表 View 中显示它?-LMLPHP
该类符合NSCoding,因此在对mappview和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在mappview上重新创建多段线,但是性能会受到影响。
编辑:给那些现在看这个的人。别这样。我想在表格单元格内创建一个映射视图,这是一个非常糟糕的主意。取而代之的是拍摄快照并保存图像。我现在正在学习。

最佳答案

更可能的是MGLMapView并没有将多行编码作为其NSCoding方法的一部分。UIView符合NSCoding,因此它的所有子类都继承了它。但这并不意味着所有这些都增加了完全编码/解码所需的一切。查看source code for MGLMapView可以发现它没有实现encodeWithCoder,这几乎可以肯定是原因所在。
将视图对象保存到数据模型中是非常不寻常的,无论是使用核心数据还是其他选项。您需要从模型对象重新创建视图状态。这可能是你现有的pointsArray。它看起来像MGLPolyLine encodes its points,所以如果您愿意,可以通过NSCoding使用它。

07-27 21:53