3

全て、

でいくつか使用すると、パフォーマンス/メモリの問題が発生しChildViewControllersますParentViewController。ここに私の状況があります: 私はParentViewController動的な数のを持っていますChildViewControllers- 時には 20 にもUIScrollViewなります。ページに複数あると問題が発生します (最初の 2 つだけを読み込んでから、スワイプしながら他のものをビルドしParentViewControllerます)。

にはChildViewController多くのことが行われており、可能な限り効率的であることを確認していますが、このアプローチが古いデバイスで機能することに懸念があります (現在、5S でクラッシュが発生しています)。 .

ビュー コントローラーを単なるビューに変更すると役立つようですが、VC が複雑であるため、かなりの労力を要します。私が持っていた 1 つの提案は、既存のビュー コントローラーのビューからビューを作成し、ビューにいくつかのデリゲート メソッドを設定し、その方法でビューと対話するParentViewControllerことでした。現在の使用方法とは対照的に、その方法の効率について考えている人はいますChildViewControllersか?

私が持っていた別の考えは、カスタムを作成しContainerViewController、そこにすべての子をスワイプさせることでしたが、UIScrollView.

何かご意見は?

4

3 に答える 3

5

個人的には、ビュー コントローラーではなくビューを使用するようにコードをリファクタリングすることはお勧めしません。ビュー コントローラー自体がメモリの問題の原因である可能性は低く、追跡しているモデル オブジェクト (およびビュー コントローラーのビューが使用するアセット) が原因であるとは考えられません。重要なのは、ビュー コントローラー (およびそのビュー) が画面からスクロールするときに単純に削除することだと思います。

スクロール ロジックでは、ビューにスクロールする子ビュー コントローラーを追加しているため、おそらく適切な包含呼び出しをすべて実行しています。

UIViewController *newChildViewController = ...
[self addChildViewController:newChildViewController];
newChildViewController.view.frame = ...; 
[self.scrollView addSubview:newChildViewController.view];
[newChildViewController didMoveToParentViewController:self];

(WWDC 2011 ビデオImplementing UIViewController Containmentを参照して、これらのコンテインメント コールを実行することが重要な理由、つまり、View Controller 階層をビュー階層と同期させることが重要である理由について説明します。)

子ビューがビューの外にスクロールすると、適切な包含呼び出しを実行して、子コントローラー (およびそのビュー) を削除します。

[childViewControllerToRemove willMoveToParentViewController:nil];
[childViewControllerToRemove.view removeFromSuperview];
[childViewControllerToRemove removeFromParentViewController];
// also remove any other strong references you have to that childViewControllerToRemove

UIPageViewControllerまたは、 (iOS 6 以降で) のスクロール ページ ビュー ( UIPageViewControllerTransitionStyleScroll) を使用することを検討することもできますtransitionStyle。これにより、ビューの内外にスクロールするビュー コントローラーを処理するために記述する必要があるカスタム コンテナー コードの量が簡素化されます。UIPageViewControllerは、一連のさまざまなビュー コントローラーのビューをスクロール (またはページング) するこの状況のた​​めに正確に設計されています。iOS 用ビュー コントローラー カタログのページ ビュー コントローラーの説明を参照してください。

于 2014-01-15T16:22:02.127 に答える
0

それをテーブルビューに変えて、セルのデキューに引き継がせることができます。その場合、一度にいくつかのメモリしか保持できません。

于 2014-01-15T16:23:45.780 に答える
0

それらをすべて に移動しても役に立たないと思いUIViewます。aChildViewController.view技術的にchildViewとして追加することなく、追加するだけでこれと同じ効果を得ることができます。へのビューの読み込みを最適化しますUIScrollView。一度に 4 つのビューしかメモリにロードされていないことを確認してください。別のオプションは、水平を使用するUITableViewUICollectionView、組み込みのメモリ管理機能を利用できるようにすることです。

于 2014-01-15T16:19:04.980 に答える