質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

747閲覧

SwiftにおけるUIViewの永続化について

wai21

総合スコア32

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/02/16 01:00

前提・実現したいこと

UIView のサブクラスを保存したい。

現在、iOS向けにある作図アプリを作成しています。
キャンバスとしてUIView のサブクラスを作成し、UIGestureRecognizer を使用して、タップした場所に記号(これもUIView のサブクラス)を描画(キャンバスにaddSubview)したり、逆に削除(キャンバスからremoveFromSuperview)するようにしています。

 このキャンバスを保存することで、複数のキャンバスを管理したり、アプリを再起動した際に再編集できるようにしたいと考えています。

 UIView のサブクラスであるキャンバスをどのように保存すればよいでしょうか。これまで、データの永続化はRealm を使用してきたので、今回もRealm を使用したいと思っています。

方法としては、

  • キャンバス、記号ともに初期化に必要な情報を個別に取得して、Realm に保存し、編集する際は、Realm の情報を取得して、キャンバスと記号を一から作成
  • キャンバス全体を一括で何らかのデータに変換し、Realm に保存し、編集する際はRealm から取得して、復元

を考えていますが、何か良い方法はあるでしょうか。

該当のソースコード

Swift

1// キャンバス 2class CanvasView: UIView { 3 /// キャンバス上の記号を管理する 4 /// キャンバス上に記号をaddSubviewした際に、その記号をここに追加する 5 var drawSpaces = Array<Symbol>() 6 7 override init(frame: CGRect) { 8 super.init(frame: frame) 9 // ジェスチャーの追加 10 addGesture() 11 } 12 /// ジェスチャーを追加する 13 func addGesture() { 14 // タップジェスチャーの追加 15 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapCanvas(_:))) 16 self.addGestureRecognizer(tapGesture) 17 // パンジェスチャーの追加 18 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panCanvas(_:))) 19 self.addGestureRecognizer(panGesture) 20 } 21 22 override func draw(_ rect: CGRect) { 23 // UIBezierPathのインスタンス生成 24 let grid = UIBezierPath() 25 // 以下略 26 // 記号を描画する場所の目安のためにグリッド線を描画 27 } 28 29 // 以下略 30} 31 32// 記号 33class Symbol: UIView { 34 var symbolData = "記号の名前" 35 36 required init(point: CGPoint) { 37 super.init(frame: CGRect(origin: point, size: CGSize(width: 30, height: 20))) 38 let imageView = UIImageView(image: "記号の画像") 39 addSubview(imageView) 40 } 41 42 required init?(coder aDecoder: NSCoder) { 43 fatalError() 44 } 45}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Viewとして保存すると復元後に編集出来ませんので、追加した記号の情報(例えば座標と種類)を保存しないといけません。
別の言い方をすると、出来上がったものを保存するのではなく、手順を保存して下さい。

投稿2018/02/16 01:14

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wai21

2018/02/16 05:21 編集

ご回答ありがとうございます。 やはり、Viewとしての保存はのちの編集には向かないということですね。 キャンバス、記号共に再生成できる情報を保存するようにします。
fuzzball

2018/02/16 05:24

向かないんじゃなくて不可能なんですが。
wai21

2018/02/16 06:53

ご回答を正確に読み取れておらず申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問