2017-11-22 12 views
0

私は実行中のアプリケーションを作っています。私はMGLMapViewを保存する際に問題があります。これには、実行中のユーザーから描画されたploylinesがコアデータに含まれています。私はエラーは発生していませんが、インスタンス化されたかのように、デコードは空のMGLMapViewをploylinesなしで返します。ユーザーが実行を保存すると、すべての情報が保存され、tableViewに表示されます。私はあなたがここで見ることができるように、私のmapViewと私のpointsArray(ユーザーによって作成されたすべてのCllocationCoordinates2Dを含む)をmapViewStoreというクラスに保存しています。Swift - MGLMapViewをCore Dataに保存してテーブルビューに表示する方法は?

My entity and attributes

それが符号化および復号化の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を作成したいと思った。代わりに、スナップショットを撮ってイメージを保存してください。私は今それを学んでいます。

答えて

1

MGLMapViewは、NSCodingメソッドの一部としてポリラインを単純にエンコードしない可能性があります。 UIViewNSCodingに準拠しているため、すべてのサブクラスが継承します。しかし、それが完全にエンコード/デコードするのに必要なすべてを追加するわけではありません。 source code for MGLMapViewを見ると、encodeWithCoderが実装されていないことがわかります。これはほぼ間違いなく説明です。

非常にコアデータまたはその他のオプションを使用していても、ビューオブジェクトをデータモデルに保存するのは珍しいことです。モデルオブジェクトからビューステートを再作成する必要があります。それはあなたの既存のpointsArrayかもしれません。 MGLPolyLine encodes its pointsのように見えるので、好きな場合はNSCodingで利用できます。

+0

地図を再描画します。私が思ったほどのパフォーマンスではありません。 MGLMapViewとMGLPolylineのソースコードを私に見せてくれてありがとう。それをするのは気にならなかった。新しいことを学びました。 –

関連する問題