2017-12-20 28 views
2

私は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

「それを止める方法」1つの簡単なアイデア:それをしないでください。また、地球上で「サブクラス化されていないView Controllerを持っている」というのはどういう意味ですか? – matt

+0

ここで無限ループの意味を詳しく教えてください。あなたのアプリはこのメソッドの実行を停止しますか? –

+1

githubにサンプルを投稿できますか?私はあなたの記述に基づいて再現することができません。違法な親ビューコントローラのアレンジメントなどを持っているような違法な行為をしているようです。私は 'viewDidLayoutSubviews'をまったく呼び出すために"テーブルビューをフリック "するとは思わないでしょう。 – matt

答えて

2

あなたがバグを見つけたように見えます。プロジェクトをダウンロードし、それを実行し

https://github.com/mattneub/InfiniteLayoutSubviewsBug

:私はここのGitHubで掲載しました最小限のサンプルプロジェクトで問題を再現することができました。 3行の単純な表が表示されます。テーブルビューまでスクロールして放してください。コンソールを見てください。私たちはviewDidLayoutSubviewsへの呼び出しを毎秒1/60に1回繰り返しています。

これはではなく、であり、私たちのコードでは再帰的なレイアウトループが原因です。私の例ではsuperに電話していません。それはログです。これはランタイムそのものですviewDidLayoutSubviewsを繰り返し永久に呼び出します。これが起こっている間、私たちのコード(printを除く)は実行されません。

その他の所見:

  • あなたは正しく観察されたように、ナビゲーションバーが大きなタイトルを使用しないように、あなたが例を変更した場合、問題が消えます。

  • テーブルビューがautolayoutを使用して配置されないように例を変更すると、問題はなくなります。

  • ビューコントローラがUITableViewControllerサブクラスになるように例を変更すると(もっと精巧に)、問題は解決します。我々はviewDidLayoutSubviewsへのいくつかの繰り返しの呼び出しを得るが、スクロールしている間は永遠にではない。

+0

私は第2または第3の解決策が好きです。 Appleからの修正が出るまでは、大きなタイトルをすべて取り出すことをお勧めします。そんなにマットありがとう! – SAHM

+0

また私の第3のポイントを参照してください – matt

+0

あなたがアップルにバグを提出しない限り、これは固定されません... – matt

関連する問題