質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

555閲覧

APIでデータが得られなかった時の処理について

Ytan

総合スコア39

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/02 14:45

疑問点

下記のソースコードようなtextFieldに値を入力してAPIからレスポンスを取得して
TableViewに表示しているのですが
textFieldに適当な文字を入力したり元のレスポンスがないnil(?)時にalertでエラーを表示したいのですが
この場合どのタイミングで下記を呼び出せば良いですか?

Queryで日本語を対応しているのですがいくら適当な文字を打ち込んだとしてもエラーのprint文が出ないので日本語変換はされているみたいです。

alert(title: "エラー",message: "メッセージ表示")

ソースコード

import UIKit import PKHUD class MovieSearchViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var table: UITableView! @IBOutlet weak var field: UITextField! @IBOutlet weak var indicater: UIActivityIndicatorView! private var items:[MovieItem] = [MovieItem]() var alertController: UIAlertController! override func viewDidLoad() { super.viewDidLoad() self.setupTable() fechData() } //エラーアラート func alert(title:String, message:String) { alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true) } func textFieldShouldReturn(_ textField: UITextField) -> Bool { fechData() return true } func fechData(){ field.resignFirstResponder() guard let text = field.text, !text.isEmpty else { return } guard let query = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { print("パーセントエンコーディング失敗") return } //LoadingAction Start HUD.show(.progress) items.removeAll() URLSession.shared.dataTask(with: URL(string: "https://api.themoviedb.org/3/search/movie?api_key=MYAPI&language=ja&query=(query)&page=1")!, completionHandler: {data, response, error in guard let data = data else { print(error?.localizedDescription ?? "Unknown error") return } var result: MovieStruct? do { result = try JSONDecoder().decode(MovieStruct.self, from: data) } catch{ print("JSON perse error") } guard let finalResult = result else { return } let newMovies = finalResult.results self.items.append(contentsOf: newMovies) DispatchQueue.main.async { self.table.reloadData() //LoadingAction Stop HUD.flash(.progress) } }).resume() } } 以下省略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ichi888

2020/11/02 15:29

どんなレスポンスが返ってくるかによってハンドリング方法が変わります。 適当な文字を入力した際、newMoviesが空になるのかな?と思ったのですが、あってます? print(newMovies)で何が出力されるか教えていただけますか?
Ytan

2020/11/03 01:10 編集

出力したらおっしゃる通り[ ]で空が返りました。 つまり空の場合わけをすればよろしいですか?
ichi888

2020/11/03 01:27

おっしゃる通りです。
Ytan

2020/11/03 02:01

教えてくださりありがとうございます。 試してみます。
Ytan

2020/11/03 02:01

ベストアンサーにしたいので回答に何らかの記述をお願いします。
guest

回答1

0

ベストアンサー

適当な文字を入力した際、Jsonの配列が空で返却されるAPIであれば、
以下のように分岐を追加することで、検索結果が0件のときの振る舞いを実装することができます。

if newMovies.isEmpty { // アラートを表示するなど }

投稿2020/11/03 03:34

ichi888

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ytan

2020/11/03 14:38

Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main threadというエラーが出たので DispatchQueueで呼び出したところ上手く行きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問