私は実行中のアプリケーションを作っています。私はMGLMapViewを保存する際に問題があります。これには、実行中のユーザーから描画されたploylinesがコアデータに含まれています。私はエラーは発生していませんが、インスタンス化されたかのように、デコードは空のMGLMapViewをploylinesなしで返します。ユーザーが実行を保存すると、すべての情報が保存され、tableViewに表示されます。私はあなたがここで見ることができるように、私のmapViewと私のpointsArray(ユーザーによって作成されたすべてのCllocationCoordinates2Dを含む)をmapViewStoreというクラスに保存しています。Swift - MGLMapViewをCore Dataに保存してテーブルビューに表示する方法は?
それが符号化および復号化のMapViewとpointsArrayに問題がないように、クラスはNSCodingに準拠。私はそれが完全である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に戻すと、空のマップが得られます。これを避ける方法はありますか?多分ポリラインを保管していますか?私も同じ問題に遭遇するかもしれませんが。
mapArrayでpointsArrayを使用してポリラインを再作成するだけで、パフォーマンスが低下します。
EDIT:これは今閲覧している人に。これをしないでください。私は非常に悪い考えであるテーブルのセルの内部にmapViewを作成したいと思った。代わりに、スナップショットを撮ってイメージを保存してください。私は今それを学んでいます。
地図を再描画します。私が思ったほどのパフォーマンスではありません。 MGLMapViewとMGLPolylineのソースコードを私に見せてくれてありがとう。それをするのは気にならなかった。新しいことを学びました。 –