Swift5初心者です.ストーリーボードは使っておりません.
UserDefaults
を使って自らが定義した型のデータを保存、参照したいと考えております。
現在ペイントアプリを開発しており、画面に絵を書いている途中でアプリを終了した場合に、次回起動時に途中まで描いていた絵を再度表示させたいと考えております。
その際に保存しておきたいデータはペンの太さ(strokeWidth
)、ペンの色(color
)、描いた線([points]
)で、これらをメンバに持つ構造体Line
を定義し、Line
型のデータ配列lines
として絵を保持しています。
struct Line { let strokeWidth: Float let color: UIColor var points: [CGPoint] } var lines = [Line]()
描画の処理はtouchesMove
で行っておりlines
オブジェクトが正しく動作していることは確認済みです。
絵を描いている途中でアプリを終了した場合に備えて、ペンを画面から離すたびにUserDefaults
でlines
を保存する実装を行いました。
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { UserDefaults.standard.set(data:lines, forKey: "lines") } }
そしてアプリの起動時にlines
オブジェクトが保存されているか確認し、保存されていればそれを画面に描画します。
if let lastLines: [Line] = UserDefaults.standard.object(key: "lines") as? [Line] { lines = lastLines setNeedsDisplay() }
これらの実装を行っても、再起動前の絵を描画することはできませんでした。
調べてみたところ、UserDefaults
は保存できるデータ型に制限(String
、Bool
等)があり、自らが定義した型のデータが保存できるわけではないとのことでした。
カスタムクラスでの保存方法としてこちらのサイト等を参考に解決を試みましたが、やはり使用できる型の制限があるようでうまくいきませんでした。
このアプリはWi-Fi環境の無い場所での使用を想定しているため、データベースやクラウドなどを用いることもできません。
どのような実装を行えばUserDefaults
に任意の型のデータを保存できるのでしょうか。
この問題を解決するコード例や、機能実現の別のアイディア等を教えていただきたいです。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/25 03:29
2020/04/25 04:34
2020/04/25 08:40