APIからJSONで取得した文字をStoryboardに出力できないです。
import Foundation import Alamofire import SwiftyJSON class WeatherDataManager: NSObject { var weatherData: WeatherDataModel? let url = "http://api.openweathermap.org/data/2.5/forecast?units=metric&q=Tokyo&APPID=2ec06eb3d8b93310aa2773a10f1dafe4" func dataRequest() { Alamofire.request(url).responseJSON { response in switch response.result { case .success(let value): let json = JSON(value) self.weatherData = WeatherDataModel(data: json) print(value) case .failure(let error): break print(error) } } } }
とコードを書いて、print(value)でJSONでのレスポンスの正常な結果が得られました。
Main.storyboardに連結したViewControllerに
import UIKit class ViewController: UIViewController { @IBOutlet weak var weatherImage: UIImageView! @IBOutlet weak var tempLabel: UILabel! @IBOutlet weak var checkButton: UIButton! let dataManager = WeatherDataManager() override func viewDidLoad() { super.viewDidLoad() self.dataManager.dataRequest() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func checkButton(_ sender: Any) { if dataManager.weatherData?.weather == "Clouds" { weatherImage.image = UIImage(named: "cloud") } else if dataManager.weatherData?.weather == "Clear" { weatherImage.image = UIImage(named: "sunny") } else if dataManager.weatherData?.weather == "Rain" { weatherImage.image = UIImage(named: "rain") } tempLabel.text = dataManager.weatherData?.temp.description self.checkButton.isHidden = true } }
と書いて、tempLabelに得られたJSON結果の
・ ・ ・ list = ( { clouds = { all = 32; }; dt = 1501470000; "dt_txt" = "2017-07-31 03:00:00"; main = { "grnd_level" = "1018.08"; humidity = 81; pressure = "1018.08"; "sea_level" = "1021.94"; temp = "29.64"; "temp_kf" = "0.74"; "temp_max" = "29.64"; ・ ・ ・
のtemp = "29.64" の29.64を表示させたいです。しかし、今何も表示されていません。ViewControllerとtempLabel: UILabel の連結は問題なくできています。それにJSONもうまく取得できているので何が問題なのかわかりません。どう直せば表示されますか?
tempLabel.text = "hogehoge" がラベルに表示されるか確認するためViewControllerには
import UIKit class ViewController: UIViewController { @IBOutlet weak var weatherImage: UIImageView! @IBOutlet weak var tempLabel: UILabel! @IBOutlet weak var checkButton: UIButton! let dataManager = WeatherDataManager() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // ここでAPIリクエストを行う self.dataManager.dataRequest() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func checkButton(_ sender: Any) { // お天気API 返却値によって画像を変更する条件式 if dataManager.weatherData?.weather == "Clouds" { // 「Clouds」だったら「曇り」 画像を表示する weatherImage.image = UIImage(named: "cloud") } else if dataManager.weatherData?.weather == "Clear" { // 「Clear」だったら「晴れ」 画像を表示する weatherImage.image = UIImage(named: "sunny") } else if dataManager.weatherData?.weather == "Rain" { // 「Rain」だったら「雨」 画像を表示する weatherImage.image = UIImage(named: "rain") } // 気温 ラベルに取得した気温を表示させる // tempLabel.text = dataManager.weatherData?.temp.description tempLabel.text = "hogehoge" self.checkButton.isHidden = true } }
ViewControllerとtempLabel: UILabel の連結状態は、
のようになっています。
WeatherDataModel.swiftには
import Foundation // 必要なフレームワークをインポートする import SwiftyJSON // SwiftyJSONによるパースを行うクラス class WeatherDataModel: NSObject { // 今日 天気(晴れ、雨等)を格納するプロパティ var weather: String = "" // 気温を格納するプロパティ var temp: Int = 0 // weatherDataManagerクラスから初期化される init?(data: JSON) { // 引数で渡ってきたJSONデータをここでパースする // 今日 天気データを取得して変数に格納する self.weather = data["list"][0]["weather"][0]["main"].stringValue //気温データを取得して変数に格納する self.temp = data["list"][0]["main"]["temp"].intValue // print("here") // print(data["list"][0]["main"]["temp"]) // print("here") // print(type(of: data)) } }
ViewControllerのレイアウト画面(Storyboard)は、
です。
ViewController全体のアウトレット接続状況は
です。
tempLabel.text = "hogehoge" でラベルに表示されますか? dataManager.weatherData はnilではないですか?
それはどのようにして確認できますか?
後半の質問でしたら print(dataManager.weatherData)で確認して下さい。
はい。fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) と nilと言われました。何が原因なのでしょうか?
WeatherDataModel(data:)のdataはData型でしょうか? Data型でしたら print(json.count) の出力を教えて下さい。Data型でなければ型を教えて下さい。
print(type(of: data)) で調べたら、型はJSONであると言われました
最初の質問の前半の結果はどうでしたか? また、let json = JSON(value) の次に行に print(json) を追加してnilかどうかチェックして下さい。nilでなければ、さらに print(data["list"][0]["main"]["temp"]) を追加して出力を教えて下さい。
すみません、tempLabel.text = "hogehoge" でラベルに表示されますか? の意味がわからず...。どのように確認できますか?
let json = JSON(value) の次の行の print(json)はnilではありませんでした。(取得したいjsonが取得できていました)
print(data["list"][0]["main"]["temp"])では 31.73 と出力され、取得したいものが取得できていました。
「どのように確認できますか?」ですが、画面上のラベルに表示されるか?という意味です。ラベルの表示がおかしいのであれば、何をやっても表示されるわけはありません。(一番最初に確認すべき項目です)
質問文に、tempLabel: UILabelのIDなどの情報のインスペクタの情報の画像を追加しました。もしかしたら必要なものが空かもしれません...。
tempLabel.text = dataManager.weatherData?.temp.description の代わりに tempLabel.text = "hogehoge" にして、ラベルに hogehoge と表示されるか?ということです。画像は必要ないので削除して下さい。
tempLabel=(UILabel!) nil と表示されました。なぜnilになってしまうのでしょうか?
試したコードを書いてみてもらえますか?(何をやっているのかさっぱり分かりません)
tempLabel.text = "hogehoge" を追加したコードを記載しました。tempLabel=(UILabel!) nil は画像の部分で表示されました。
回答2件
あなたの回答
tips
プレビュー