Tableviewのcellに3つのラベルを貼りたいので、TextData1を用意し実行しました。
この状態で期待通りの動作をしてくれるので、今度はAPIで受信したjsonをTextData1と同じ形にすれば、無事に動作すると考え、
空の変数を用意し、APIの結果を代入してTableviewcellに利用しようと試みました。
しかし、TableViewで利用する変数をつくる部分でエラーとなり対処方法がわからず困っています。
swift
1 2import UIKit 3 4class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 6 @IBOutlet weak var APPNAME: UILabel! 7 @IBOutlet weak var Change: UIButton! 8 @IBOutlet var ApprovalTableView: UITableView! 9 10 // 11 var TestData1 = [ 12 ["ID":"19540921","NAME":"安倍 晋三","DOCUCODE":"https://www.abcdefg.com/19540921"], 13 ["ID":"19400920","NAME":"麻生 太郎","DOCUCODE":"https://www.abcdefg.com/19400920"], 14 ["ID":"19630110","NAME":"河野 太郎","DOCUCODE":"https://www.abcdefg.com/19630110"] 15 ] 16 17 // 18 var TestData2 = [[String:String]()] 19 // 20 var TestData3 = [[String:String]]() 21 22 //構造体を準備 23 struct JsonForm : Codable { 24 var ID : String 25 var NAME : String 26 var DOCUCODE : String 27 28 } 29 30 // 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 34 ApprovalTableView.dataSource = self 35 ApprovalTableView.delegate = self 36 37 // 38 let listUrl = "https://省略します" 39 let APIurl = URL(string: listUrl)! 40 41 // 42 URLSession.shared.dataTask(with: APIurl) { (data, response, error) in 43 44 // 45 if (error == nil) { 46 //API成功 47 //print("API OK") 48 49 // 50 guard let data = data else { return } 51 52 print(type(of: self.TestData1)) //A: 53 print(type(of: self.TestData2)) //B: 54 print(type(of: self.TestData3)) //C: 55 56 // 57 do { 58 // 59 let json:[JsonForm] = try JSONDecoder().decode([JsonForm].self, from: data) 60 let top = json as NSArray //配列? 61 var i = 0 62 for _ in top { 63 64 // 65 print(i) 66 print("ID:"+json[i].ID) 67 print("NAME:"+json[i].NAME) 68 print("DOCUCODE:"+json[i].DOCUCODE) 69 70 /* 71 //TestData2に加える 72 self.TestData2[i]["ID"] = json[i].ID //D:ここで Thread 2: Fatal error: Index out of range 73 self.TestData2[i]["NAME"] = json[i].NAME // 74 self.TestData2[i]["DOCUCODE"] = json[i].DOCUCODE // 75 */ 76 77 /* 78 //TestData3に加える 79 self.TestData3[i]["ID"] = json[i].ID //E:ここで Thread 2: Fatal error: Index out of range 80 self.TestData3[i]["NAME"] = json[i].NAME // 81 self.TestData3[i]["DOCUCODE"] = json[i].DOCUCODE // 82 */ 83 84 i = i + 1 85 86 } 87 88 } catch { 89 90 print(error) 91 92 } 93 94 } else { 95 //API失敗 96 //print("API NG") 97 98 } 99 100 }.resume() 101 102 // 103 104 } 105 106 // 107 override func prepare(for segue: UIStoryboardSegue, sender: Any? ) { 108 109 // 110 if let detailVC = segue.destination as? DetailViewController, let indexPath = sender as? IndexPath { 111 112 detailVC.message = TestData1[indexPath.row]["DOCUCODE"] 113 114 } 115 116 } 117 118 //セッションの数 119 func numberOfSections(in tableView: UITableView) -> Int { 120 return 1 121 } 122 123 //セルの数 124 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 125 return TestData1.count 126 } 127 128 //セルのラベルに描写 129 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 130 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath ) 131 132 //tag1 133 let Label1 = cell.viewWithTag(1) as? UILabel 134 Label1?.text = TestData1[indexPath.row]["ID"] 135 136 //tag2 137 let Label2 = cell.viewWithTag(2) as? UILabel 138 Label2?.text = TestData1[indexPath.row]["NAME"] 139 140 //tag3 141 let Label3 = cell.viewWithTag(3) as? UILabel 142 Label3?.text = TestData1[indexPath.row]["DOCUCODE"] 143 144 // 145 return cell 146 147 } 148 149 //セルの高さ 150 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 151 return 100 152 } 153 154 //各セルをタップ 155 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 156 performSegue(withIdentifier: "MainToDetail", sender: indexPath) 157 158 } 159 160} 161
##教えて頂きたいことが2つあります。
質問1:TestData1での値が無い場合の宣言方法は、TestData2またはTestData3では間違いでしょうか?
ちなみに、TestData1、TestData2、TestData3をそれぞれ print(type(of:TestData)) すると、全て
Array<Dictionary<String, String>>
と表示されます。※A,B,Cの部分
正しい宣言をご教授下さい。
質問2:仮に宣言がTestData2またはTestData3で正しいとして、値を代入する記述をDやEの部分で実行すると、
Thread 2: Fatal error: Index out of range
となり、止まってしまいます。
配列の個数の問題のようなので、質問1に絡んでいると思うのですが、代入方法をご教授下さい。
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー