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

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

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

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

Q&A

解決済

2回答

5905閲覧

SwiftでTableViewCellにネストしたTableViewのcellForRowAtが呼ばれない

label8

総合スコア16

Swift

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

0グッド

2クリップ

投稿2018/03/15 03:43

編集2018/03/15 05:35

いつもお世話になっています。

Storyboard上でViewControllerにTableViewを貼り付け、
TableViewCellはカスタムセルとしてxibで生成しています。
TableViewCellのxibにさらにTableViewを貼り付け、そのセルの処理を以下のように記述しました。

swift

1import UIKit 2 3class CustomCell: UITableViewCell { 4 5 @IBOutlet weak var innerTableView: UITableView! { 6 didSet { 7 let nib = UINib(nibName: "InnerTableCell", bundle: nil) 8 innerTableView.register(nib, forCellReuseIdentifier: "innerTableCell") 9 } 10 } 11 12 var user = User([:]) 13 var userData = [[String: Any]]() 14 15 override func awakeFromNib() { 16 super.awakeFromNib() 17 18 innerTableView.dataSource = self 19 innerTableView.delegate = self 20 } 21 22 override func setSelected(_ selected: Bool, animated: Bool) { 23 super.setSelected(selected, animated: animated) 24 } 25 26 func apply(user: User) { 27 self.user = user 28 userData.append(["id": user.id ?? 0, "row": user.height ?? 0, "title": "身長", "value": user.bloodtype ?? "未選択"]) 29 ・・・ append続く 30 } 31} 32 33extension CustomCell: UITableViewDataSource { 34 35 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 36 return 1; 37 } 38 39 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 40 return profile.count 41 } 42 43 // 呼ばれない 44 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 45 let cell = tableView.dequeueReusableCell(withIdentifier: "innerTableCell", for: indexPath) as! InnerTableCell 46 return cell 47 } 48 49} 50 51extension CustomCell: UITableViewDelegate { 52 53 // 試しに設定してみた 54 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 55 return 400.0 56 } 57 58}

この処理だと
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
が呼ばれず、何も表示されませんでした。

ちなみに呼び出し元のテーブルでは

swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 let cellType = CellType(rawValue: indexPath.row) 3 switch cellType! { 4 case .ProfileCell: 5 let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomCell 6 cell.apply(user: user) 7 return cell 8 default: 9 let cell = tableView.dequeueReusableCell(withIdentifier: "blankCell", for: indexPath) as! BlankCell 10 return cell 11 } 12}

のように設定しています。

まだまだ理解力不足で何が原因なのかがわからず・・・
時間だけを費やしてしまっています。
TableViewのネスト方法も検索してみましたが、ほぼネタがなく有力な情報が得られない状態です。

どなたか解決できる方がいらっしゃいましたらご教授いただきたいです。
よろしくお願いいたします。

追加:
xibの状態も添付しました。

イメージ説明

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

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

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

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

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

guest

回答2

0

自己解決

内側のTableViewのHeightをセットしたところ処理が呼ばれセルが表示できるようになりました。

投稿2018/03/15 07:12

label8

総合スコア16

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

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

0

書き方が古い。

swift

1func numberOfSections(in tableView: UITableView) -> Int {

外側のTableViewが動いているのなら、こっちのコードはコピペしてきたってことかな。

投稿2018/03/15 04:06

fuzzball

総合スコア16731

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

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

label8

2018/03/15 04:14 編集

最初は記述していませんでしたが、 セクション数の指定がないから表示されないのかと思って後から記述しました。 が、状況は変わりませんでした。 オプショナルなのでなくてもいいはずですが。。。
fuzzball

2018/03/15 04:19

これは失礼。デフォルトは1でしたね。 tableView(_:numberOfRowsInSection:)の中に print(profile.count) を追加してみて下さい。
label8

2018/03/15 04:24

現在決め打ちでprofileの配列の中には14個値をセットしているので、 トレースすると14でした。
fuzzball

2018/03/15 04:39

呼ばれないというのはどうやって確認しましたか? ブレークポイントかprint文でしょうか?
fromageblanc

2018/03/15 04:52

データソースのdelegateにセットすべきポインタが間違ってる気もします。なんとなく。
label8

2018/03/15 05:01

> 呼ばれないというのはどうやって確認しましたか? > ブレークポイントかprint文でしょうか? 以下の定義にブレークポイントを貼りステップで確認しました。 awakeFromNib ↓ apply ↓ numberOfSectionsInTableView ↓ numberOfRowsInSection ↓ cellForRowAt ※ここが呼ばれないで描画される
label8

2018/03/15 05:11

> データソースのdelegateにセットすべきポインタが間違ってる気もします innerTableView.dataSource = self innerTableView.delegate = self この部分ですかね? TableViewの処理の移譲先はCustomCellというのが間違いということでしょうか? そもそもコントローラー側で処理させないといけないとか。。。
fuzzball

2018/03/15 05:14 編集

CustomCell内の numberOfRowsInSection や numberOfSectionsInTableView は呼ばれてるんですよね?(cellForRowAtだけが呼ばれない、と)
label8

2018/03/15 05:31

大変失礼しました。。。 後から追加してみたnumberOfSectionsInTableViewも呼ばれていませんでした。 numberOfRowsInSectionのみ呼ばれます! ということはセルを描画するためのセクションがないからnumberOfRowsInSectionが呼ばれないんですかね。。。
fuzzball

2018/03/15 05:33

numberOfSectionsInTableViewについては、私が回答に書きました。
label8

2018/03/15 05:39

ちなみに今、xibのキャプチャも添付しましたが、 ViewControllerにTableViewを貼り付けた際はカスタムセルをUIから操作できるのですが、 xibのContentViewに貼り付けた場合はたとえばPrototype Cellsがありません。 ここらへんも関係してくるのかなと少し懸念しています。
fuzzball

2018/03/15 05:54

カスタムセル用のxibを作るとき、User Interface の View で作成しましたか? もしそうであれば、Empty で作成して Table View Cell を配置して下さい。
label8

2018/03/15 06:07

> カスタムセル用のxibを作るとき、User Interface の View で作成しましたか? まさにそうでした! ひとまずEmptyで作成してみてまた結果をご報告させていただきます! ありがとうございます!
label8

2018/03/15 06:40

取り急ぎご報告ですが、Emptyを使用してみましたが結果は同じでした。。。涙
fuzzball

2018/03/15 06:55

[外側TableView] - [外側Cell] - [内側TableView] ここまでをStoryboard上で配置して試せますか?
label8

2018/03/15 07:10

fuzzball様 解決できました! CustomCellに配置したTableViewの高さがセットされていなかったので、 CustomCell自体の高さが決まっていない(ゼロ)状態だったのが原因でした。 なので、ひとまず内側のTableViewに適当なHeightを設定したところ、 無事に処理が呼ばれセルが表示されるようになりました! ここまでいろいろアドバイスをいただき大変感謝いたします! また何かありましたらどうぞよろしくお願いいたします。
fuzzball

2018/03/15 08:10

制約を付けてないのかな?まぁ解決出来て良かったです。 今試してみたら、0じゃなくても小さい値だと同じ症状(cellForRowAtが呼ばれない)になりますね。これは覚えておこう‥。
label8

2018/03/15 08:56

はい。。。 高さ制約を付けていませんでした。 > 0じゃなくても小さい値だと同じ症状(cellForRowAtが呼ばれない)になりますね。 なるほど、勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問