質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

740閲覧

reloadData()でcellForRowAt indexPathが呼び出されない

ottotto

総合スコア22

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/11/13 08:43

編集2018/11/13 09:04

お世話になっております。
予め構築済みの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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/11/13 08:52

「intが返る」というのはどういう意味でしょうか? 「1以上の値」という意味でしょうか?
fuzzball

2018/11/13 08:54

reload前の初期状態では正しく表示されている(tableView(_:cellForRowAt:)が呼ばれている)ということでしょうか?
ottotto

2018/11/13 09:00

記載不足で申し訳ありません。reloadを外しreturn self.timelineArr.countをreturn 2としてテストした場合、正常にセルが2つ表示されていました。
fuzzball

2018/11/13 09:00

「予め構築済みのtableview」というのはどういう意味でしょうか?何か構築されているようには見えないのですが。「空っぽのTableView」のことを「構築済み」と呼んでいるのでしょうか?
ottotto

2018/11/13 09:09

度々説明不足で大変申し訳ございません。構築済みと記載したのは、以前はnumberOfRowsInSectionの中に仮置きでtweetDescriptionsをcountで返しておりました。その際には4つ分セルが生成され、高さ調整など全ての機能が問題なく動作しておりましたので、構築済みと記載させていただきました。
fuzzball

2018/11/13 09:23

ようするにデータを取得出来ていないということですよね?TableView関係なくないですか?
ottotto

2018/11/13 09:27

jsonデータをprintしましたがそちらは正常に取得出来ています。return self.timelineArr.count こちらもprintすると2(配列の要素数が2なので正常です)が返されますのでデータの取得は出来ていると思われます。
fuzzball

2018/11/13 10:17 編集

それぞれ、どこでprintしたのか書いて下さい。あと、少しコードを整理して下さい。(ダミーデータなどはもう不要ですよね?)
fuzzball

2018/11/14 03:50

解決したのは良かったのですが、「正常にセルが2つ表示されていました」とか「その際には4つ分セルが生成され」というのは何だったのでしょうか?
guest

回答1

0

ベストアンサー

cellForRowAtのメソッドが呼ばれない原因は、timelineTableViewをviewDidLoadの中でコードで生成しているのに、そのtimelineTableViewをaddSubviewで画面に追加していないためです。画面に表示されないテーブルはセルを取得する必要もないということです。

ついでに指摘しておくと、CustomTableViewCellのレイアウトはxibファイルで作っているのだと思いますが、それをテーブルで使うには、registerメソッドを使ってカスタムセルのidentifierを登録しておく必要があります。

(参考)
https://qiita.com/naochi___/items/dcbf58acb925fc716af5#やりかた2xibに別ファイルとして出してそれを使う

(追記)
もしかして、StoryboardにTableViewとカスタムセルを貼り付けていてそちらを使う予定だったのなら、コードでtimelineTableViewを生成するのをやめてStoryboardからtimelineTableViewをoutlet接続すればいいです。

投稿2018/11/14 02:40

編集2018/11/14 02:47
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ottotto

2018/11/14 03:28

無事出来ました。 >StoryboardからtimelineTableViewをoutlet接続 こちらが正解でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問