gpt4 book ai didi

ios - Swift - 如何在核心数据中存储 MGLMapView 以在 TableView 上显示它?

转载 作者:行者123 更新时间:2023-11-28 15:12:09 26 4
gpt4 key购买 nike

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

My entity and attributes

类符合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 时,我得到一张空 map 。有没有办法避免这种情况?也许存储折线?如果我这样做的话,我可能会遇到同样的问题。

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

编辑:致现在正在观看的人。不要这样做。我想在表格单元格内创建一个 mapView,这是一个非常糟糕的主意。取而代之的是拍摄快照并保存图像。我现在才知道。

最佳答案

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

无论是使用 Core Data 还是任何其他选项,将 View 对象保存到数据模型都是非常不常见的。您需要从模型对象重新创建 View 状态。这可能是您现有的 pointsArray。看起来像 MGLPolyLine encodes its points ,因此您可以根据需要通过 NSCoding 使用它。

关于ios - Swift - 如何在核心数据中存储 MGLMapView 以在 TableView 上显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47444883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com