嘿伙计们我正在制作一个正在运行的应用程序,而且我在保存我的MGLMapView时遇到了麻烦,其中包含从Core Data中运行的用户中提取的ploylines。我没有得到任何错误,但解码返回一个没有ploylines的空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,这是一个非常糟糕的主意。而是拍摄快照并保存图像。我现在才开始学习。
答案 0 :(得分:1)
更有可能的是,MGLMapView
根本不会将多边形线编码为其NSCoding
方法的一部分。 UIView
符合NSCoding
,因此它的所有子类都继承了它。但这并不意味着它们都会添加完全编码/解码所需的一切。查看source code for MGLMapView
表明它没有实现encodeWithCoder
,这几乎可以肯定是解释。
非常将视图对象保存到您的数据模型是不常见的,无论是使用Core Data还是其他任何选项。您需要从模型对象重新创建视图状态。这可能是您现有的pointsArray
。它看起来像MGLPolyLine
encodes its points,因此如果您愿意,可以通过NSCoding
使用它。