質問編集履歴

2

情報の追加

2017/08/01 07:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -407,3 +407,89 @@
407
407
  ```
408
408
 
409
409
  とエラーが出て落ちてしまいました。
410
+
411
+ WeatherDataManagerも書き換え、
412
+
413
+ ```ここに言語を入力
414
+
415
+ import Foundation
416
+
417
+
418
+
419
+ // 必要なフレームワークをインポートする
420
+
421
+ import Alamofire
422
+
423
+ import SwiftyJSON
424
+
425
+
426
+
427
+ // AlamofireによるAPI通信を管理するクラスを定 義する
428
+
429
+ class WeatherDataManager: NSObject {
430
+
431
+
432
+
433
+
434
+
435
+ // レスポンスデータをパースするモデルクラス イ ンスタンスを格納するプロパティ
436
+
437
+ var weatherData: WeatherDataModel?
438
+
439
+ // リクエストするURL
440
+
441
+ let url = "http://api.openweathermap.org/data/2.5/forecast?units=metric&q=Tokyo&APPID=2ec06eb3d8b93310aa2773a10f1dafe4"
442
+
443
+
444
+
445
+ // APIリクエストを実行する
446
+
447
+ func dataRequest() {
448
+
449
+ // AlamofireによるAPI通信
450
+
451
+ Alamofire.request(url).responseJSON { response in
452
+
453
+ switch response.result {
454
+
455
+ case .success(let value):
456
+
457
+ // 通信成功時 処理
458
+
459
+ // レスポンスデータをJSON型に変換する
460
+
461
+ // これ SwiftyJSON ルール
462
+
463
+ let json = JSON(value)
464
+
465
+
466
+
467
+ // JSONデータを引数に渡してモデルクラス インスタンスを生成
468
+
469
+ self.weatherData = WeatherDataModel(data: json)
470
+
471
+ case .failure(let error): break // 通信失敗時 処理 // 今回 ログ出力だけ
472
+
473
+ print(error)
474
+
475
+
476
+
477
+ }
478
+
479
+ }
480
+
481
+ }
482
+
483
+ // 気温 ラベルに取得した気温を表示させる
484
+
485
+ tempLabel.text = dataManager.weatherData?.temp.description
486
+
487
+ }
488
+
489
+
490
+
491
+ ```
492
+
493
+ としましたが、tempLabelがないと言われ(その通りなのですが。
494
+
495
+ しかし、CheckViewControllerに定義したものを WeatherDataManagerの方に持ってくる方法がわからなかった)ました。

1

情報の追加

2017/08/01 07:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -309,3 +309,101 @@
309
309
  ```
310
310
 
311
311
  と書きました。
312
+
313
+ fuzzballさんのコメントを受け、CheckViewControllerを以下のように書き換えました。
314
+
315
+ ```ここに言語を入力
316
+
317
+ import Foundation
318
+
319
+ import UIKit
320
+
321
+
322
+
323
+
324
+
325
+ class CheckViewController: UIViewController {
326
+
327
+ @IBOutlet weak var weatherImage: UIImageView!
328
+
329
+
330
+
331
+ @IBOutlet weak var tempLabel: UILabel!
332
+
333
+ // APIリクエストや、レスポンスデータを利用するため クラス インスタンス
334
+
335
+ let dataManager = WeatherDataManager()
336
+
337
+
338
+
339
+ override func viewDidLoad() {
340
+
341
+ super.viewDidLoad()
342
+
343
+ // Do any additional setup after loading the view, typically from a nib.
344
+
345
+ // ここでAPIリクエストを行う
346
+
347
+ if dataManager.weatherData?.weather == "Clouds" {
348
+
349
+ // 「Clouds」だったら「曇り」 画像を表示する
350
+
351
+ weatherImage.image = UIImage(named: "cloud")
352
+
353
+ } else if dataManager.weatherData?.weather == "Clear" {
354
+
355
+ // 「Clear」だったら「晴れ」 画像を表示する
356
+
357
+ weatherImage.image = UIImage(named: "sunny")
358
+
359
+ } else if dataManager.weatherData?.weather == "Rain" {
360
+
361
+ // 「Rain」だったら「雨」 画像を表示する
362
+
363
+ weatherImage.image = UIImage(named: "rain")
364
+
365
+ }
366
+
367
+
368
+
369
+ self.dataManager.dataRequest()
370
+
371
+
372
+
373
+ print("here")
374
+
375
+ print(dataManager.weatherData)
376
+
377
+ // 気温 ラベルに取得した気温を表示させる
378
+
379
+ tempLabel.text = dataManager.weatherData?.temp.description
380
+
381
+
382
+
383
+ }
384
+
385
+
386
+
387
+ override func didReceiveMemoryWarning() {
388
+
389
+ super.didReceiveMemoryWarning()
390
+
391
+ // Dispose of any resources that can be recreated.
392
+
393
+ }
394
+
395
+
396
+
397
+ }
398
+
399
+ ```
400
+
401
+ このように書き換え実行すると
402
+
403
+ ```ここに言語を入力
404
+
405
+ 2017-08-01 15:23:03.412 WeatherApp[9709:864615] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<WeatherApp.ViewController 0x7fecff505a80> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key weatherImage.'
406
+
407
+ ```
408
+
409
+ とエラーが出て落ちてしまいました。