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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

2249閲覧

UIViewにUITableViewを入れたい

nishimu

総合スコア26

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

1グッド

0クリップ

投稿2020/02/09 11:59

##やったこと
Storyboard上でまずViewControllerをおき、次にUIViewを画面全体に広げたあと、UITableViewをUIViewの上におきました。そして、UITableViewCellをUITableViewに設置し、 UITableViewとViewControllerをDelegate, DataSourceでつなぎました。そして、コードには

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // please use Auto layout in real project override func viewDidLoad() { super.viewDidLoad() } //Tableview let TODO = ["Ⅰ", "Ⅱ", "Ⅲ"] func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return TODO.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルを取得する let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // セルに表示する値を設定する cell.textLabel!.text = TODO[indexPath.row] return cell } }

と記述しました

Runすると以下の警告が出ました

[TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <UITableView: 0x7f888f827000; frame = (0 263; 350 522); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x60000073cb40>; layer = <CALayer: 0x60000095a680>; contentOffset: {0, 0}; contentSize: {350, 132}; adjustedContentInset: {0, 0, 0, 0}; dataSource: <MathDuel.HomeViewController: 0x7f888e606a90>>

##調べた内容
ネットでUITableViewをUIView上で使うための方法を調べました。ですが、前例がとても古かったり、英語で記述されたものばかりで私の参考にはなりませんでした。
##実現したいこと
UITableViewをUIViewの上において使いたいです。最終的にはUITableViewを伸縮可能にさせたいと思っています。

##バージョン
Xcode Version 11.3.1

hoshi-takanori👍を押しています

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

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

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

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

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

thyda.eiqau

2020/02/09 15:40

前例がとても古いから参考にならないというのは分からなくもないですが、英語で記述されているから参考にならないというのはどういう意味でしょうか?
thyda.eiqau

2020/02/09 15:45

あと、UITableViewContollerを使わない理由もあわせてご提示ください。
nishimu

2020/02/09 22:49

失礼します。 >>>英語の勉強はプログラミングと合わせて頑張っていますが、日本語で読んでも分からないようなものが英語で書かれていては初心者の私にとってはどれも分からないものなのです。決して英語で書いてあるものが参考にならないのではなく、「私にとって、未熟な私にとって」参考にならないというだけです。ですから、みなさまのお力をお借りしつつ、1日でも早くまず、日本語で仕組みを理解したいと思います。誤解を生じさせてしまっていた場合、申し訳ありません。 >>>TableViewController使わずにUIViewにUITableViewを埋め込んだ場合Storyboard の数がTableViewControllerを使う場合よりひとつ減らせて、全体の構造上すっきりするのではないかと考えたからです。 わかりにくい点が多くて申し訳ありません。ご教授お願いいたします。
guest

回答1

0

ベストアンサー

問題の警告は tableView が window に配置されてない状態で layout を計算しようとすると出るもので、最近の iOS の仕様変更のようですね。(日本語の情報としては https://qiita.com/shou8/items/1d3454d176865adb457f がありましたが、初心者が読んでも何も分からないと思います。)
実際に UIView の中に UITableView を設置して試してみたところ、そのままでは警告は出ませんでしたが、viewDidLoad や viewWillAppear で tableView.layoutIfNeeded() すると警告が出ました。

swift

1 @IBOutlet var tableView: UITableView? 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 // これは警告が出ます。(viewWillAppear でも同様。) 7 tableView?.layoutIfNeeded() 8 } 9 10 override func viewWillAppear(_ animated: Bool) { 11 super.viewWillAppear(animated) 12 13 // これなら警告は出ません。(viewDidLoad でも同様。) 14 if tableView?.window != nil { 15 tableView?.layoutIfNeeded() 16 } 17 } 18 19 override func viewWillLayoutSubviews() { 20 super.viewWillLayoutSubviews() 21 22 // これも警告は出ません。 23 tableView?.layoutIfNeeded() 24 }

ところでご質問は警告の件だけでしょうか?

p.s.
UITableViewContoller を使うと他の view を配置できないので、「最終的にはUITableViewを伸縮可能にさせたい」などの事情があるなら UITableViewContoller を使わないのは普通です。

投稿2020/02/09 21:56

hoshi-takanori

総合スコア7901

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問