teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コードを追記

2019/11/28 11:30

投稿

hayabusabusash
hayabusabusash

スコア776

answer CHANGED
@@ -4,4 +4,70 @@
4
4
  あるキーに対して値が対応する形になっています。(Key-Value)
5
5
  なので現状は`MemoImage`というキーに対して毎回上書きをかけている状態になっていると思います。
6
6
 
7
- もし違う画像を保存したいなら`MemoImage`で統一するのではなく、キーをユニークなものにする必要があると思います。
7
+ もし違う画像を保存したいなら`MemoImage`で統一するのではなく、キーをユニークなものにする必要があると思います。
8
+
9
+ ## 2019/11/28追記(コードについて)
10
+ ちょっと回りくどいかもしれませんが、現状Stringになっているメモを以下のような構造体にします。
11
+
12
+ ```Swift
13
+ struct Memo: Codable {
14
+ let id: String
15
+ let content: String
16
+ }
17
+ ```
18
+
19
+ contentにはメモの内容を入れて、
20
+ idには`UUID().uuidString`を保存して画像の読み込みの時に使用します。
21
+ メモを保存する時に、このidをキーとして画像を保存してしまえばメモと画像が紐づく形で保存ができると思います。
22
+
23
+ `Codable`に準拠しているので
24
+ `JSONEncoder`、`JSONDecoder`を使用してData型にしたり元のMemoの構造体に戻すことができます。
25
+ 少し面倒ですが一度Data型として取り出し、その後Memoの配列として取り出すような流れになります。
26
+
27
+ ```Swift
28
+ // AddViewController
29
+
30
+ @IBAction func save(_ sender: Any) {
31
+ let inputText = memoTextView.text
32
+
33
+ // 新しいメモの構造体を生成
34
+ let memo = Memo(id: UUID().uuidString, content: inputText)
35
+
36
+ // 一度Dataとして取り出し、そのあとにMemoの配列にデコード
37
+ if let data = UserDefaults.standard.data(forKey: /*Memoの配列を保存するキー*/),
38
+ let storedMemoArray = try? JSONDecoder().decode([Memo].self, from: data) {
39
+ var newMemoArray = storedMemoArray
40
+ newMemoArray.append(memo)
41
+
42
+ // Dataに戻して保存
43
+ if let newData = try? JSONEncoder().encode(newMemoArray) {
44
+ UserDefaults.standard.set(newData, forKey: /*Memoの配列を保存するキー*/)
45
+ }
46
+ } else {
47
+ // 何も保存されていなかった時の処理
48
+ }
49
+
50
+ // ImagePickerから選択された画像を取り出し、Dataに変換
51
+ if let image = imageView.image,
52
+ let imageData = image.jpegData(compressionQuality: 0.8) {
53
+ // キーには上で生成したMemoのid(UUID)を使う
54
+ UserDefaults.standard.set(imageData, forKey: memo.id)
55
+ }
56
+ }
57
+
58
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
59
+ let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
60
+ self.imageView.image = image
61
+ UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
62
+ self.dismiss(animated: true)
63
+
64
+ // ここで保存はせずに、imageViewに選択した画像をセットするだけにします
65
+ }
66
+ ```
67
+
68
+ 保存はこんな感じになると思います。
69
+
70
+ Memoのidが保存された画像と紐づいているので、
71
+ 画像の読み込みに特定のMemoのidを使って読みこめば期待する動作になるはずです。
72
+
73
+ 簡単にですが[サンプル](https://github.com/hayabusabusa/TeratailTodoSample)を作ってみたので、よかったら参考にしてください。