回答編集履歴

1

コードを追記

2019/11/28 11:30

投稿

hayabusabusash
hayabusabusash

スコア767

test CHANGED
@@ -11,3 +11,135 @@
11
11
 
12
12
 
13
13
  もし違う画像を保存したいなら`MemoImage`で統一するのではなく、キーをユニークなものにする必要があると思います。
14
+
15
+
16
+
17
+ ## 2019/11/28追記(コードについて)
18
+
19
+ ちょっと回りくどいかもしれませんが、現状Stringになっているメモを以下のような構造体にします。
20
+
21
+
22
+
23
+ ```Swift
24
+
25
+ struct Memo: Codable {
26
+
27
+ let id: String
28
+
29
+ let content: String
30
+
31
+ }
32
+
33
+ ```
34
+
35
+
36
+
37
+ contentにはメモの内容を入れて、
38
+
39
+ idには`UUID().uuidString`を保存して画像の読み込みの時に使用します。
40
+
41
+ メモを保存する時に、このidをキーとして画像を保存してしまえばメモと画像が紐づく形で保存ができると思います。
42
+
43
+
44
+
45
+ `Codable`に準拠しているので
46
+
47
+ `JSONEncoder`、`JSONDecoder`を使用してData型にしたり元のMemoの構造体に戻すことができます。
48
+
49
+ 少し面倒ですが一度Data型として取り出し、その後Memoの配列として取り出すような流れになります。
50
+
51
+
52
+
53
+ ```Swift
54
+
55
+ // AddViewController
56
+
57
+
58
+
59
+ @IBAction func save(_ sender: Any) {
60
+
61
+ let inputText = memoTextView.text
62
+
63
+
64
+
65
+ // 新しいメモの構造体を生成
66
+
67
+ let memo = Memo(id: UUID().uuidString, content: inputText)
68
+
69
+
70
+
71
+ // 一度Dataとして取り出し、そのあとにMemoの配列にデコード
72
+
73
+ if let data = UserDefaults.standard.data(forKey: /*Memoの配列を保存するキー*/),
74
+
75
+ let storedMemoArray = try? JSONDecoder().decode([Memo].self, from: data) {
76
+
77
+ var newMemoArray = storedMemoArray
78
+
79
+ newMemoArray.append(memo)
80
+
81
+
82
+
83
+ // Dataに戻して保存
84
+
85
+ if let newData = try? JSONEncoder().encode(newMemoArray) {
86
+
87
+ UserDefaults.standard.set(newData, forKey: /*Memoの配列を保存するキー*/)
88
+
89
+ }
90
+
91
+ } else {
92
+
93
+ // 何も保存されていなかった時の処理
94
+
95
+ }
96
+
97
+
98
+
99
+ // ImagePickerから選択された画像を取り出し、Dataに変換
100
+
101
+ if let image = imageView.image,
102
+
103
+ let imageData = image.jpegData(compressionQuality: 0.8) {
104
+
105
+ // キーには上で生成したMemoのid(UUID)を使う
106
+
107
+ UserDefaults.standard.set(imageData, forKey: memo.id)
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
116
+
117
+ let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
118
+
119
+ self.imageView.image = image
120
+
121
+ UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
122
+
123
+ self.dismiss(animated: true)
124
+
125
+
126
+
127
+ // ここで保存はせずに、imageViewに選択した画像をセットするだけにします
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+ 保存はこんな感じになると思います。
136
+
137
+
138
+
139
+ Memoのidが保存された画像と紐づいているので、
140
+
141
+ 画像の読み込みに特定のMemoのidを使って読みこめば期待する動作になるはずです。
142
+
143
+
144
+
145
+ 簡単にですが[サンプル](https://github.com/hayabusabusa/TeratailTodoSample)を作ってみたので、よかったら参考にしてください。