私はUIStoryboardでUITableViewで設定されているビューコントローラを持っています。 UITableViewは、4面すべてのコントローラのSafeAreaに制約されています。viewDidLayoutSubviews空白のメソッドの無限ループでスタック
この質問が以前に尋ねられたように見えるかもしれませんが、質問が見つかるたびに、viewDidLayoutSubviewsでループが発生するような変更が行われているためです。私はブランクのviewDidLayoutSubviewsと基本的なUITableViewCells(nibなし)の実装を持っています。しかし、iOS 11、Xcode 9.2では、テーブルビューをフリックすると、無限ループでviewDidLayoutSubviewsが呼び出されます。これは私の実装です:
- (void)viewDidLayoutSubviews {
NSLog(@"viewDidLayoutSubviews");
[super viewDidLayoutSubviews];
}
私の人生はどうなっているのか分かりません。
編集:コントローラーにはNavigationControllerがあり、(iAdSuiteの例のように)BannerViewControllerに埋め込まれたUISplitViewControllerのマスターコントローラーです。
編集:これは、シミュレータ上のすべてのデバイスでiOS 11(11.2まで)で発生します。 iOS 10.3は発生しません。 viewDidLayoutSubviews
はiOS 10.3でも呼び出されません。 UISplitViewController/BannerViewControllerの代わりにUIViewController/TableViewでNav Controllerを使用するだけで同じ結果が得られます。だから問題はそこにはなく、iOS 11で起こっていることから起きているようだ。
EDIT:これは奇妙なことだ - ナビゲーションコントローラ用に大きなタイトルが選択されているときだけ起こっているようだ!
if (@available(iOS 11.0, *)) {
self.navigationController.navigationBar.prefersLargeTitles = YES;
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways;
}
EDIT:この問題は簡単に再現できます。 AppleのiAd Suiteサンプルコードをダウンロードし、SplitNavigationControllerプロジェクトを使用しました。 iOS 11用のプロジェクトを更新しました。セーフエリアレイアウトガイドを使用するようにストーリーボードを更新しました。 MasterViewControllerをUITableViewControllerからUITableViewのUIViewControllerに変更しました。これはストーリーボードのセーフエリアレイアウトガイドに制約されていました。 MasterViewControllerにprefersLargeTitlesとlargeTitleDisplayModeを追加しました。 viewDidLayoutSubviewsメソッドにNSLogステートメントを追加しました。この動作は簡単に観察できます。私はこれがiOS 11の本当の問題だと思っています。私はそれを真剣に考えようと思っています。他の誰かが考えや示唆を提供できるのであれば、私は感謝しています。
EDIT:マットは、以下のリンクで発見されるように、この問題を再現し、GitHubのプロジェクトでそれを投稿することができました(感謝マット!):InfiniteLayoutSubviewsBug
「それを止める方法」1つの簡単なアイデア:それをしないでください。また、地球上で「サブクラス化されていないView Controllerを持っている」というのはどういう意味ですか? – matt
ここで無限ループの意味を詳しく教えてください。あなたのアプリはこのメソッドの実行を停止しますか? –
githubにサンプルを投稿できますか?私はあなたの記述に基づいて再現することができません。違法な親ビューコントローラのアレンジメントなどを持っているような違法な行為をしているようです。私は 'viewDidLayoutSubviews'をまったく呼び出すために"テーブルビューをフリック "するとは思わないでしょう。 – matt