たった二日でマスターできるiphoneアプリ開発講座という本で作っているアプリなのですがシミュレータで起動して検索するまでは良いのですがその後検索結果がTableViewに反映されず、AppDelegate.swiftにて下記のエラーが出てしまいます。解決方法が分かる方いましたらお願い致します。storyboardの接続の解除と再接続等やって見ましたが解決しませんでした。
デバックエリアでは以下のような表示になっています。
viewcontroller.swift
swift5
1import UIKit 2 3class ViewController: UIViewController, UISearchBarDelegate, UITableViewDataSource { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 9 //Search Bar のdelegate通知先を設定 10 searchText.delegate = self 11 //入力のヒントとなる、プレースホルダーを設定 12 searchText.placeholder = "お菓子の名前を入力してください" 13 //TableViewのdataSourceを設定 14 tableView.dataSource = self 15 16 } 17 18 19 20 21 @IBOutlet weak var searchText: UISearchBar! 22 23 @IBOutlet weak var tableView: UITableView! 24 25 //お菓子のリスト(タプル配列) 26 var okashiList : [(name:String , maker:String , link:URL , image:URL)] = [] 27 28 29 //検索ボタンをクリック時 30 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 31 //キーボードを閉じる 32 view.endEditing(true) 33 34 if let searchWord = searchBar.text { 35 //デバックエリアに出力 36 print(searchWord) 37 //入力されていたらお菓子を検索 38 searchOkashi(keyword: searchWord) 39 } 40 } 41 //JSONのitem内のデータ構造 42 struct ItemJson : Codable { 43 //お菓子の名称 44 let name: String? 45 //メーカー 46 let maker : String? 47 //掲載URL 48 let url : URL? 49 //画像URL 50 let image : URL? 51 52 } 53 54 //JSONのデータ構造 55 struct ResultJson : Codable { 56 //複数要素 57 let item :[ItemJson]? 58 } 59 //searchOkashiメソッド 60 //第一引数 : keyword 検索したいワード 61 func searchOkashi(keyword : String){ 62 //お菓子の検索キーワードをURLエンコードする 63 guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { 64 return 65 } 66 67 68 // リクエストURLの組み立て 69 guard let req_url = URL(string: "https://sysbird.jp/toriko/api/?apikey=guest&format=json&keyword=(keyword_encode)&max=10&order=r") else { 70 return 71 } 72 print(req_url) 73 74 //リクエストに必要な情報を生成 75 let req = URLRequest(url: req_url) 76 //データ転送を管理するためのセッションを生成 77 let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main) 78 //リクエストをタスクとして登録 79 let task = session.dataTask(with: req, completionHandler: { 80 (data , response , error) in 81 //セッションを終了 82 session.finishTasksAndInvalidate() 83 // do try catch エラーハンドリング 84 do { 85 //JSONDecoderのインスタンス取得 86 let decoder = JSONDecoder() 87 //受け取ったJSONデータをパース(解析)して格納 88 let json = try decoder.decode(ResultJson.self,from:data!) 89 90 //お菓子の情報が取得できているか確認 91 if let items = json.item { 92 //お菓子のリストを初期化 93 self.okashiList.removeAll() 94 //取得しているお菓子の数だけ処理 95 for item in items { 96 //お菓子の名称、メーカー名、掲載URL, 画像URLをアンラップ 97 if let name = item.name , let maker = item.maker , let link = item.url , let image = item.image{ 98 //一つのお菓子をタプルでまとめて管理 99 let okashi = (name,maker,link,image) 100 //お菓子の配列へ追加 101 self.okashiList.append(okashi) 102 } 103 } 104 105 //TableViewを更新する 106 self.tableView.reloadData() 107 108 if let okashidbg = self.okashiList.first{ 109 print("----------------") 110 print("okashiList[0] = (okashidbg)") 111 } 112 } 113 } catch { 114 //エラー処理 115 print("エラーが出ました") 116 } 117 118 }) 119 //ダウンロードの開始 120 task.resume() 121 122 } 123 //cellの総数を返すdatasourceメソッド必ず記述する必要があります 124 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 125 //お菓子リストの総数 126 return okashiList.count 127 } 128 //cell に値を設定するdatasourceメソッド。必ず記述する必要があります。 129 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 130 //今回表示を行うCellオブジェクト(1行)を取得する 131 let cell = tableView.dequeueReusableCell(withIdentifier: "okashicell", for: indexPath) 132 //お菓子のタイトル設定 133 cell.textLabel?.text = okashiList[indexPath.row].name 134 //お菓子画像を取得 135 if let imageData = try? Data(contentsOf: okashiList[indexPath.row].image){ 136 //正常に取得できた場合には、UIimageで画像オブジェクトを生成してcellにお菓子画像を設定。 137 cell.imageView?.image = UIImage(data:imageData) 138 } 139 //設定ずみのCellオブジェクトを画面に反映。 140 return cell 141 } 142} 143 144
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 06:00
2020/07/01 06:03
2020/07/01 06:08