Swift - 如何在 Core Data 中存储 MGLMapView 以在 table 视图中显示它?
Swift - How to store MGLMapView in Core Data to display it on table view?
大家好,我正在制作一个 运行ning 应用程序,我在保存我的 MGLMapView 时遇到了问题,它包含从核心数据中的用户 运行ning 绘制的多义线。我没有收到任何错误,但解码 returns 一个没有多段线的空 MGLMapView 就好像它刚刚被实例化一样。当用户保存 his/her 运行 时,它会存储所有信息并将其显示在 table 视图中。我将我的 mapView 和 pointsArray(其中包含用户创建的所有 ClocationCoordinates2D)存储在名为 mapViewStore 的 class 中,如您在此处所见。
class符合NSCoding,所以对mapView和pointsArray的编解码没有问题。我不得不分解坐标,因为我无法对 ClocationCoordinate2D 进行完整编码。
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 上重新创建多段线,但性能会受到影响。
编辑:致现在正在观看的人。不要这样做。我想在 table 单元格内创建一个 mapView,这是一个非常糟糕的主意。取而代之的是拍摄快照并保存图像。我现在才知道。
更有可能的是 MGLMapView
根本没有将多边形线编码为其 NSCoding
方法的一部分。 UIView
符合 NSCoding
,所以它的所有子类都继承了它。但这并不意味着他们都添加了完全 encoded/decoded 所需的一切。查看 source code for MGLMapView
表明它没有实现 encodeWithCoder
,这几乎可以肯定是解释。
将视图对象保存到您的数据模型是非常不寻常的,无论是使用 Core Data 还是任何其他选项。您需要从模型对象重新创建视图状态。那可能是您现有的 pointsArray
。它看起来像 MGLPolyLine
encodes its points,因此如果您愿意,可以通过 NSCoding
使用它。
大家好,我正在制作一个 运行ning 应用程序,我在保存我的 MGLMapView 时遇到了问题,它包含从核心数据中的用户 运行ning 绘制的多义线。我没有收到任何错误,但解码 returns 一个没有多段线的空 MGLMapView 就好像它刚刚被实例化一样。当用户保存 his/her 运行 时,它会存储所有信息并将其显示在 table 视图中。我将我的 mapView 和 pointsArray(其中包含用户创建的所有 ClocationCoordinates2D)存储在名为 mapViewStore 的 class 中,如您在此处所见。
class符合NSCoding,所以对mapView和pointsArray的编解码没有问题。我不得不分解坐标,因为我无法对 ClocationCoordinate2D 进行完整编码。
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 上重新创建多段线,但性能会受到影响。
编辑:致现在正在观看的人。不要这样做。我想在 table 单元格内创建一个 mapView,这是一个非常糟糕的主意。取而代之的是拍摄快照并保存图像。我现在才知道。
更有可能的是 MGLMapView
根本没有将多边形线编码为其 NSCoding
方法的一部分。 UIView
符合 NSCoding
,所以它的所有子类都继承了它。但这并不意味着他们都添加了完全 encoded/decoded 所需的一切。查看 source code for MGLMapView
表明它没有实现 encodeWithCoder
,这几乎可以肯定是解释。
将视图对象保存到您的数据模型是非常不寻常的,无论是使用 Core Data 还是任何其他选项。您需要从模型对象重新创建视图状态。那可能是您现有的 pointsArray
。它看起来像 MGLPolyLine
encodes its points,因此如果您愿意,可以通过 NSCoding
使用它。