お世話になっております。
予め構築済みのtableviewにURLRequestにて取得したjsonデータによって構築したセルを後から差し替えたいと思っています。
通信完了後、reloadData()にてnumberOfRowsInSectionにintが返るまでは確認出来ているのですが、その後cellForRowAt indexPathの処理が走らずtableviewが空の状態になったままエラー等もなく困っております。
間違えている点をお教え頂ければ幸いです。よろしくお願いします。
Swift
1 2import UIKit 3import Firebase 4 5 6 7class ViewController: UIViewController , UITabBarDelegate, UITableViewDelegate, UITableViewDataSource { 8 9 let timelineApiUrl = "hoge.api" 10 var timelineTableView: UITableView! 11 var tweetIcon = ["kari_icon", "kari2_icon", "kari3_icon", "kari_icon"] 12 var submitImage: String? = "kari_image" 13 var tweetTo : String? = "" 14 var tweetName = ["一人目", "test2", "3人目", "test4"] 15 var tweetDescriptions = [ 16 "一人目のツイートです", 17 "test2のツイート内容", 18 "3人目のツイートを表示", 19 "test4's tweet" 20 ] 21 var timelineData: NSArray = [] 22 var timelineArr : [Dictionary<String, AnyObject>] = [] 23 var getJson: NSDictionary! 24 var userName = "" 25 var userComment = "" 26 27 28 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 timelineTableView = UITableView(frame: self.view.frame, style: UITableViewStyle.grouped) 33 timelineTableView.delegate = self 34 timelineTableView.dataSource = self 35 timelineTableView.estimatedRowHeight = 5 //セルの高さ 36 timelineTableView.rowHeight = UITableViewAutomaticDimension 37 if let timelineurl = URL(string: timelineApiUrl) { 38 let timelineReq = NSMutableURLRequest(url: timelineurl) 39 timelineReq.httpMethod = "GET" 40 let task = URLSession.shared.dataTask(with: timelineReq as URLRequest, completionHandler: { (data, resp, err) in 41 42 DispatchQueue.main.sync { 43 // 受け取ったdataをJSONパース、エラーならcatchへジャンプ 44 do { 45 // dataをJSONパースし、グローバル変数"getJson"に格納 46 self.timelineData = try (JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSArray)! 47 self.timelineArr = self.timelineData as! [Dictionary<String, AnyObject>] 48 } catch { 49 print ("json error") 50 return 51 } 52 self.timelineTableView.reloadData() 53 } 54 }) 55 task.resume() 56 } 57 } 58 59 override func didReceiveMemoryWarning() { 60 super.didReceiveMemoryWarning() 61 } 62 63 64 65 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 66 return self.timelineArr.count 67 } 68 69 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 70 let cell = tableView.dequeueReusableCell(withIdentifier: "tweetCell") as! CustomTableViewCell 71 cell.tweetNameLabel?.sizeToFit() 72 cell.tweetDescriptionLabel?.numberOfLines = 0 73 cell.tweetNameLabel?.numberOfLines = 0 74 cell.tweetImageView.image = UIImage(named: tweetIcon[indexPath.row]) 75 cell.submitImageView.image = UIImage(named: submitImage!) 76 cell.tweetDescriptionLabel.text = self.timelineArr[indexPath.row]["text"] as? String 77 cell.tweetNameLabel.text = tweetDescriptions[indexPath.row] 78 cell.submitImageView.isHidden = true 79 if (submitImage) != nil { 80 cell.submitImageView.isHidden = false 81 } 82 if (tweetTo) != nil { 83 cell.submitImageView.isHidden = false 84 } 85 86 return cell 87 } 88 89 90} 91
Swift
1import UIKit 2 3class CustomTableViewCell: UITableViewCell { 4 5 @IBOutlet weak var tweetImageView: UIImageView! 6 @IBOutlet weak var tweetNameLabel: UILabel! 7 @IBOutlet weak var tweetDescriptionLabel: UILabel! 8 @IBOutlet weak var submitImageView: UIImageView! 9 @IBOutlet weak var tweetToButton: UIButton! 10 11 override func awakeFromNib() { 12 super.awakeFromNib() 13 } 14 15 override func setSelected(_ selected: Bool, animated: Bool) { 16 super.setSelected(selected, animated: animated) 17 } 18 19 20 21}
「intが返る」というのはどういう意味でしょうか? 「1以上の値」という意味でしょうか?
reload前の初期状態では正しく表示されている(tableView(_:cellForRowAt:)が呼ばれている)ということでしょうか?
記載不足で申し訳ありません。reloadを外しreturn self.timelineArr.countをreturn 2としてテストした場合、正常にセルが2つ表示されていました。
「予め構築済みのtableview」というのはどういう意味でしょうか?何か構築されているようには見えないのですが。「空っぽのTableView」のことを「構築済み」と呼んでいるのでしょうか?
度々説明不足で大変申し訳ございません。構築済みと記載したのは、以前はnumberOfRowsInSectionの中に仮置きでtweetDescriptionsをcountで返しておりました。その際には4つ分セルが生成され、高さ調整など全ての機能が問題なく動作しておりましたので、構築済みと記載させていただきました。
ようするにデータを取得出来ていないということですよね?TableView関係なくないですか?
jsonデータをprintしましたがそちらは正常に取得出来ています。return self.timelineArr.count こちらもprintすると2(配列の要素数が2なので正常です)が返されますのでデータの取得は出来ていると思われます。
それぞれ、どこでprintしたのか書いて下さい。あと、少しコードを整理して下さい。(ダミーデータなどはもう不要ですよね?)
解決したのは良かったのですが、「正常にセルが2つ表示されていました」とか「その際には4つ分セルが生成され」というのは何だったのでしょうか?
回答1件
あなたの回答
tips
プレビュー