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

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

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

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

Swift

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

Q&A

1回答

1998閲覧

APIを使った画像検索システム

mountainbook

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/02/26 03:00

swift初心者です。
xcodeで、画像検索APIを使った簡単な画像検索アプリを作っています。
textfield(変数名: text )に何らかの語を書き、サーチをかけるとそれに関する画像が
imageview (変数名: pic )に表示するといった内容になっています。

エラーが出ていないにも関わらず、ボタンを押してもimageviewに画像が表示されません。
なぜ表示されないんでしょうか?

ちなみに、ATSを無効にするため、 "Info.plist" に "App Transport Security Setting" の項目を追加し、 "Allow Arbitrary Loads" を YES にしてあり、APIは取得済みです。

曖昧な質問の仕方で申し訳ありませんがお力添え頂けましたら幸いです。
よろしくお願いします。

   Xcode Version 9.2 を使用

下にコード、実際の写真を示します。

swift

1 2 3import UIKit 4 5class ViewController: UIViewController { 6 7 @IBAction func rightswipe(_ sender: Any) { 8 if(imageSub != 0){ 9 imageSub = imageSub-1 10 } 11 if let url = URL(string: wordImageArray[imageSub]) { 12 let req = URLRequest(url: url) 13 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 14 if let data = data { 15 if let anImage = UIImage(data: data) { 16 DispatchQueue.main.async { 17 self.pic.image = anImage 18 } 19 } 20 } 21 }) 22 task.resume() 23 } 24 25 } 26 27 @IBAction func leftswipe(_ sender: Any) { 28 //imageSubを1つすすめる 29 imageSub = imageSub+1 30 31 //画像配列の末尾に到達している場合、配列に新たな10件を登録する 32 if((imageSub) == wordImageArray.count){ 33 34 //パラメータのstartを決める 35 let startPara: String = String(imageSub) 36 37 //検索ワード 38 let pasteboard = UIPasteboard.general 39 let copiedText = pasteboard.string 40 41 // パラメータを指定する 42 let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":copiedText,"start":startPara] 43 44 // パラメータをエンコードしたURLを作成する 45 let requestUrl = createRequestUrl(parameter: parameter as! [String : String]) 46 47 // APIをリクエストする 48 request(requestUrl: requestUrl) { result in 49 if let url = URL(string: self.wordImageArray[self.imageSub+1]) { 50 let req = URLRequest(url: url) 51 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 52 if let data = data { 53 if let anImage = UIImage(data: data) { 54 DispatchQueue.main.async { 55 self.pic.image = anImage 56 } 57 } 58 } 59 }) 60 task.resume() 61 } 62 } 63 }else{ 64 if let url = URL(string: wordImageArray[imageSub]) { 65 let req = URLRequest(url: url) 66 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 67 if let data = data { 68 if let anImage = UIImage(data: data) { 69 DispatchQueue.main.async { 70 self.pic.image = anImage 71 } 72 } 73 } 74 }) 75 task.resume() 76 } 77 } 78 79 } 80 81 @IBOutlet weak var pic: UIImageView! 82 83 @IBOutlet weak var text: UITextField! 84 85 // APIを利用するためのアプリケーションID(APIキー) 86 let apikey: String = "(APIキー)" 87 88 //APIを利用するためのサーチエンジンキー(検索エンジンキー) 89 let cx: String = "(検索エンジンキー)" 90 91 //利用するAPIのサーチタイプ 92 let searchType: String = "image" 93 94 // APIのURL 95 let entryUrl: String = "(APIのURL)" 96 97 //関連画像URLを格納する配列 98 var wordImageArray: [String] = [String]() 99 100 //現在表示している画像の添字を格納する変数 101 var imageSub :Int = 0; 102 103 104 105 @IBAction func button(_ sender: Any) { 106 let query = text.text 107 //配列の要素全削除 108 wordImageArray.removeAll() 109 wordImageArray.append(text.text!) 110 // パラメータを指定する 111 let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":query] 112 113 // パラメータをエンコードしたURLを作成する 114 let requestUrl = createRequestUrl(parameter: parameter as! [String : String]) 115 116 // APIをリクエストする 117 request(requestUrl: requestUrl) { result in 118 if let url = URL(string: self.wordImageArray[0]) { 119 let req = URLRequest(url: url) 120 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 121 if let data = data { 122 if let anImage = UIImage(data: data) { 123 DispatchQueue.main.async { 124 self.pic.image = anImage 125 } 126 } 127 } 128 }) 129 task.resume() 130 } 131 } 132} 133 134 override func viewDidLoad() { 135 super.viewDidLoad() 136 // Do any additional setup after loading the view, typically from a nib. 137 // textField の情報を受け取るための delegate を設定 138 text.delegate = self as? UITextFieldDelegate 139 140 } 141 142 override func didReceiveMemoryWarning() { 143 super.didReceiveMemoryWarning() 144 // Dispose of any resources that can be recreated. 145 } 146 147 148 func textFieldShouldReturn(_ textField: UITextField) -> Bool{ 149 // キーボードを閉じる 150 textField.resignFirstResponder() 151 152 return true 153 } 154 155 // パラメータのURLエンコード処理 156 func encodeParameter(key: String, value: String) -> String? { 157 // 値をエンコードする 158 guard let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else { 159 // エンコード失敗 160 return nil 161 } 162 // エンコードした値をkey=valueの形式で返却する 163 return "(key)=(escapedValue)" 164 } 165 166 // URL作成処理 167 func createRequestUrl(parameter: [String: String]) -> String { 168 var parameterString = "" 169 for key in parameter.keys { 170 // 値の取り出し 171 guard let value = parameter[key] else { 172 // 値なし。次のfor文の処理を行なう 173 continue 174 } 175 176 // 既にパラメータが設定されていた場合 177 if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 { 178 // パラメータ同士のセパレータである&を追加する 179 parameterString += "&" 180 } 181 182 183 184 // 値をエンコードする 185 guard let encodeValue = encodeParameter(key: key, value: value) else { 186 // エンコード失敗。次のfor文の処理を行なう 187 continue 188 } 189 // エンコードした値をパラメータとして追加する 190 parameterString += encodeValue 191 192 } 193 let requestUrl = entryUrl + "?" + parameterString 194 return requestUrl 195 } 196 197 // 検索結果をパース 198 func parseData(items: [Any], resultHandler: @escaping (([String]?) -> Void)) { 199 200 for item in items { 201 202 // レスポンスデータから画像の情報を取得する 203 guard let item = item as? [String: Any], let imageURL = item["link"] as? String else { 204 resultHandler(nil) 205 return 206 } 207 print(imageURL) 208 209 // 配列に追加 210 wordImageArray.append(imageURL) 211 } 212 213 resultHandler(wordImageArray) 214 } 215 216 // リクエストを行なう 217 func request(requestUrl: String, resultHandler: @escaping (([String]?) -> Void)) { 218 // URL生成 219 guard let url = URL(string: requestUrl) else { 220 // URL生成失敗 221 resultHandler(nil) 222 return 223 } 224 225 // リクエスト生成 226 let request = URLRequest(url: url) 227 228 // APIをコールして検索を行う 229 let session = URLSession.shared 230 let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in 231 // 通信完了後の処理 232 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "") 233 234 // エラーチェック 235 guard error == nil else { 236 // エラー表示 237 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) 238 239 // UIに関する処理はメインスレッド上で行なう 240 DispatchQueue.main.async { 241 self.present(alert, animated: true, completion: nil) 242 } 243 resultHandler(nil) 244 return 245 } 246 247 // JSONで返却されたデータをパースして格納する 248 guard let data = data else { 249 // データなし 250 resultHandler(nil) 251 return 252 } 253 254 // JSON形式への変換処理 255 guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else { 256 // 変換失敗 257 resultHandler(nil) 258 return 259 } 260 261 // データを解析 262 guard let resultSet = jsonData["items"] as? [Any] else { 263 // データなし 264 resultHandler(nil) 265 return 266 } 267 self.parseData(items: resultSet, resultHandler: resultHandler) 268 } 269 // 通信開始 270 task.resume() 271 } 272} 273 274

引用テキスト

実際の画像

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

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

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

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

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

guest

回答1

0

これは質問に対する回答ではありません。

エラーが出ていないにも関わらず、ボタンを押してもimageviewに画像が表示されません。

と書かれていますが、これはあなたがエラーを無視しているからエラーが出ていないだけです。

適当に抜き出します

swift

1if let url = URL(string: wordImageArray[imageSub]) { 2 ... 3}

このif文ではurlがnilであった場合は何も行わずに処理が終了します。

あなたがいうところの「エラーが出ていないにも関わらず」は、正しくはあなたがエラーを表示していないだけです。

投稿2018/02/26 07:30

MasakiHori

総合スコア3371

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問