前提・実現したいこと
ライブラリを使って取得したデータをカスタムセルに渡したいです。
カスタムセルは https://satoriku.com/customcell/ さんを参考にしました。
発生している問題・エラーメッセージ
添付画像のようにデータが渡せていません。
該当のソースコード
class ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource { // User Model struct PageInfo: Codable { let title: String let url: String } // 配列 var pageInfos: [PageInfo] = [] override func viewDidLoad() { super.viewDidLoad() // カスタムセル登録 tableView.register(UINib(nibName: "MainTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell") let url = URL(string: "https://twitter.com/Apple")! LPMetadataProvider().startFetchingMetadata(for: url) { metadata, error in guard let meta = metadata else { return } print(meta.title ?? "") // タイトル取得 print(meta.url ?? "") // URL取得 print(meta.imageProvider ?? "") // image取得 let stringUrl = meta.url?.absoluteString let pages = PageInfo(title: meta.title ?? "", url: stringUrl ?? "https://twitter.com/Apple") self.pageInfos.append(pages) print("pageInfosの中身は・・・") print(self.pageInfos) print("pageInfosの数は・・・") print(self.pageInfos.count) } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.pageInfos.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainTableViewCell cell.iconImage.image = UIImage(systemName: "swift") cell.title.text = pageInfos[indexPath.row].title // print("ここは・・・") // print(pageInfos[indexPath.row].title) return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100 }
試したこと
上記のコードを書いてデバッグしたところ
Apple (@Apple) https://twitter.com/Apple pageInfosの中身は・・・ [Stringer.LifeViewController.PageInfo(title: "Apple (@Apple)", url: "https://twitter.com/Apple")] pageInfosの数は・・・ 1
となりました。
あとはこのデータをセルに渡すだけなのですが...なぜかデータがセルに反映されません。。
確認したこと
・UITableViewの紐付け確認
・仮データを入れてのデータ反映確認
・セルの数を動的ではなく、静的(例:1,2とか)で出して確認
・printで主要なデータの中身を確認
どれも問題なかったです...
LPMetadataProvider は非同期でデータを取得してバックグラウンドスレッドでコールバックを呼ぶようなので、メインスレッドに戻して配列にデータを入れて tableView.reliadData() すれば良いのでは。
override func viewDidLoad() {
super.viewDidLoad()...
DispatchQueue.main.sync {
self.tableView.reloadData()
}
...}
でよろしいでしょうか?
回答1件
あなたの回答
tips
プレビュー