QiitaAPIを取得して、TabeleViewCellに表示するサンプルを作成中です。
レスポンスは返ってくるのですが、Cellに表示されてスクロールすると落ちてしまいます。
(エラー内容;Thread 5: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0))
ViewController
1import UIKit 2 3class ViewController: UIViewController { 4 5 private var qiitaModel:[QiitaModel] = [] 6 private let api = QiitaAPI() 7 8 private let cellClassName = "TableViewCell" 9 private let reuseId = "TableViewCell" 10 11 @IBOutlet weak var tableView: UITableView!{ 12 didSet{ 13 let nibName = UINib(nibName: cellClassName, bundle: nil) 14 tableView.register(nibName, forCellReuseIdentifier: reuseId) 15 tableView.delegate = self 16 tableView.dataSource = self 17 } 18 } 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 //API通信する 23 api.getQiitaAPI { [self](users,error) in 24 if let _error = error { 25 //api通信エラーが起きた時の処理 26 debugPrint(_error) 27 return 28 } 29 guard let _users = users else { 30 //apiは成功してるのにレスポンスが空の時 31 return 32 } 33 34 self.qiitaModel = _users 35 self.tableView.isHidden = false 36 tableView.reloadData() 37} 38} 39} 40 41extension ViewController:UITableViewDelegate,UITableViewDataSource{ 42 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 43 qiitaModel.count 44 } 45 46 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 47 guard let cell = tableView.dequeueReusableCell(withIdentifier: reuseId, for: indexPath) as? TableViewCell 48 else { 49 return UITableViewCell() 50 } 51 let user = qiitaModel[indexPath.row] 52 cell.configure(user: user) 53 return cell 54} 55 56 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 57 return 300 58 } 59 60} 61
QiitaModel
1import Foundation 2 3struct QiitaModel:Codable{ 4 let title:String 5 let createdat:String 6 var user: User 7 8 enum CodingKeys: String, CodingKey { 9 case title = "title" 10 case createdat = "created_at" 11 case user = "user" 12 } 13 14} 15 16struct User:Codable { 17 let name:String 18 let profile_image_url:String? 19 20 21 enum CodingKeys:String,CodingKey { 22 case name = "name" 23 case profile_image_url = "profile_image_url" 24 } 25} 26
TableViewCell
1import UIKit 2 3class TableViewCell: UITableViewCell { 4 5 6 @IBOutlet weak var iconImage: UIImageView! 7 @IBOutlet weak var nameLabel: UILabel! 8 @IBOutlet weak var titleLabel: UILabel! 9 @IBOutlet weak var createdLabel: UILabel! 10 11 12 13 override func prepareForReuse() { 14 super.prepareForReuse() 15 16 iconImage.image = nil 17 nameLabel.text = nil 18 titleLabel.text = nil 19 createdLabel.text = nil 20 } 21 22 func configure(user:QiitaModel){ 23 24 if let iconImageUrlStr = user.user.profile_image_url { 25 iconImage.image = UIImage() 26 } 27 28 nameLabel.text = user.user.name 29 titleLabel.text = user.title 30 createdLabel.text = user.createdat 31} 32 33 34 35} 36
QiitaAPI
1import Foundation 2 3final class QiitaAPI { 4 5 func getQiitaAPI(completion: (([QiitaModel]?, Error?) -> Void)?){ 6 guard let url = URL(string: "https://qiita.com/api/v2/items?page=1&per_page=20" ) else {return} 7 8 var request = URLRequest(url: url) 9 request.httpMethod = "GET" 10 11 let task = URLSession.shared.dataTask(with: url){(data,response,err) in 12 13 if let err = err{ 14 print("両方の取得に失敗しました",err) 15 return 16 } 17 if let data = data { 18 do { 19// let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) 20 let qiita = try JSONDecoder().decode([QiitaModel].self, from: data) 21 completion?(qiita,nil) 22 print("json",qiita) 23 }catch(let err){ 24 print("両方の取得に失敗しました",err) 25 } 26 27 } 28 29 } 30 task.resume() 31 } 32} 33
<試したこと>
エラー表記で検索したところ、IBOutletの接続がおかしいと出ることがある
と書いてあったので、xibのカスタムセルのIBOutlet接続をしっかり確認し
再ビルドしました。
しかし、エラーが消えません。
どなたかご教授願います。
よろしくお願いいたします。
あなたの回答
tips
プレビュー