回答編集履歴

1

別解を追記

2020/09/06 13:10

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -137,3 +137,189 @@
137
137
  }
138
138
 
139
139
  ```
140
+
141
+
142
+
143
+ ##追記
144
+
145
+
146
+
147
+ UserDefaults を使うとなると、まずはエラーが出ないようにする必要があります。
148
+
149
+ エラーのうち一つ目は、`Data`型を渡さなければいけないところに`Data?`型を渡していることが原因です。
150
+
151
+
152
+
153
+ が、そもそも使おうとしているメソッドが古く廃止予定のメソッドなので、現行(Swift5)のメソッドに合わせて書き換える必要があります。
154
+
155
+
156
+
157
+ ```Swift
158
+
159
+ import UIKit
160
+
161
+
162
+
163
+ class ViewController: UIViewController {
164
+
165
+ let defaults = UserDefaults.standard
166
+
167
+ let image = UIImage(named: "あつもり2")
168
+
169
+
170
+
171
+ @IBOutlet weak var imageview: UIImageView!
172
+
173
+ {
174
+
175
+ didSet
176
+
177
+ {
178
+
179
+ imageview.image = image
180
+
181
+ }
182
+
183
+ }
184
+
185
+
186
+
187
+ override func viewDidLoad() {
188
+
189
+ super.viewDidLoad()
190
+
191
+ // Do any additional setup after loading the view.
192
+
193
+ }
194
+
195
+
196
+
197
+ @IBAction func save(_ sender: Any) {
198
+
199
+ // Value of optional type 'UIImage?' must be unwrapped to a value of type 'UIImage'
200
+
201
+ // let pngImageData: Data? = UIImagePNGRepresentation(imageview.image)
202
+
203
+ let pngImageData = imageview.image?.pngData()
204
+
205
+ defaults.set(pngImageData, forKey: "画像キー")
206
+
207
+ }
208
+
209
+ }
210
+
211
+ ```
212
+
213
+
214
+
215
+ 一方、遷移先についてはこのような感じになります。
216
+
217
+ こちらは、取得するためのメソッド名が不足していることがエラーの原因です。
218
+
219
+
220
+
221
+ ```Swift
222
+
223
+ import UIKit
224
+
225
+
226
+
227
+ class nextViewController: UIViewController {
228
+
229
+ let defaults = UserDefaults.standard
230
+
231
+
232
+
233
+ @IBOutlet weak var nextimageview: UIImageView!
234
+
235
+ {
236
+
237
+ didSet
238
+
239
+ {
240
+
241
+ // Cannot call value of non-function type 'UserDefaults'
242
+
243
+ // let nextimage = UIImage(data: defaults(forKey: "画像キー"))
244
+
245
+ if let data = defaults.data(forKey: "画像キー") {
246
+
247
+ nextimageview.image = UIImage(data: data)
248
+
249
+ }
250
+
251
+ }
252
+
253
+ }
254
+
255
+
256
+
257
+ override func viewDidLoad() {
258
+
259
+ super.viewDidLoad()
260
+
261
+
262
+
263
+ // Do any additional setup after loading the view.
264
+
265
+ }
266
+
267
+ }
268
+
269
+ ```
270
+
271
+
272
+
273
+ しかし、実はこの方法ではうまく動きません。
274
+
275
+
276
+
277
+ というのは、`ViewController` の `save()`が実行される前に、`nextViewController` の `nextViewController` に設定しているプロパティオブザーバが作用し、画像が保存されていないのにデータを読み込もうとしてしまうためです。
278
+
279
+
280
+
281
+ 従って、`ImageView`に画像を設定するのは、`viewWillAppear()`以降によびだされるメソッド内でおこなうことになります。
282
+
283
+
284
+
285
+ ```Swift
286
+
287
+ import UIKit
288
+
289
+
290
+
291
+ class nextViewController: UIViewController {
292
+
293
+ let defaults = UserDefaults.standard
294
+
295
+
296
+
297
+ @IBOutlet weak var nextimageview: UIImageView!
298
+
299
+
300
+
301
+ override func viewDidLoad() {
302
+
303
+ super.viewDidLoad()
304
+
305
+ // Do any additional setup after loading the view.
306
+
307
+ }
308
+
309
+
310
+
311
+ override func viewWillAppear(_ animated: Bool) {
312
+
313
+ super.viewWillAppear(animated)
314
+
315
+ if let data = defaults.data(forKey: "画像キー") {
316
+
317
+ nextimageview.image = UIImage(data: data)
318
+
319
+ }
320
+
321
+ }
322
+
323
+ }
324
+
325
+ ```