質問

根本的な問題は、「ナビゲーションスタックにプッシュできるUIViewControllerの数」です。メモリ警告を表示したり、ウォッチドッグの終了を獲得したりすることはありません。

基本的に3つのエンティティのデータベースであるアプリケーションがあり、それぞれが他のエンティティと関係を持つことができ、その関係がUIViewControllerに表示されているとします。ユーザーはこれらの関係をたどることができ、それぞれが新しいコントローラーを表示します-エンティティがA、B、C、A-> B-> C-> B-> C-> Aの場合、各種類のビュースタック上に2回あります。プッシュおよびポップする方法、特定のコントローラーにプッシュする方法を理解し、ナビゲーションスタックを無期限に拡張するのではなく、ナビゲーションスタックでビューコントローラーを再利用するのが最善だと思います。

これを行うには、FirstEntityViewControllerが必要なたびにナビゲーションスタックをスキャンして、 [self isKindOfClass:[FirstEntityViewController class]]; のオブジェクトを見つけ、そのビューを再調整するように設計されたメソッドを呼び出します。私が現在見たいもの-UITableViewCellを再利用するときと同じ方法でデータを更新するだけです。

これは、NavigationControllerに与える可能性のある効果を除いて問題ありません。 UINavigationController:popToViewController:animated:を使用する場合、ユーザーが" Back"をタップして見つけると予想されるビューを含む、ポップするビューの上のすべてを破棄すると思います。ナビゲーションバーで。したがって、ユーザーは関係をタップし、戻って「ハァッ」と言います

一致するコントローラーをナビゲーションスタックから削除し、スタックの一番上にポップした場合、ユーザーが移動したFirstEntityViewControllerのインスタンスまで戻らない限り、戻る動作はOKのままです。そうしないと、ナビゲーションが一貫していないように見えます。

コントローラをスタックから削除し、再利用されたコントローラがポップされたときに元の場所に戻すことができるように、スタック内の何らかの場所を保持する適切なソリューションですか?ビューの種類とデータ表示の独自のリストを維持して、ポップ時にポップするビューの下のビューを置き換えて、戻るナビゲーションの一歩先を維持できるようにしますか?

それとも複雑になりすぎていますか? OSはUITableViewCellsが再利用されるのと同じ方法でView Controllerの大部分を再利用するため、この状況について心配する必要はありません。また、深さ50のナビゲーションスタックを持つことで実際のメモリやパフォーマンスへの影響はありませんか?

役に立ちましたか?

解決

ViewControllerインスタンスはUINavigationControllerのスタックに残りますが、トップビュー以外のビューはいつでもアンロードできます(View Controllerは viewDidUnload メッセージで通知されます)。

つまり、トップビューの下のビューはぶら下がりません。最終的にメモリ不足の状態でアンロードされるため、View Controllerを再利用する必要はありません。

他のヒント

最後に、既にnavcontrollerスタックにあるviewcontrollerを再びプッシュできないことを確認しました。新しいViewControllerを作成してスタックにプッシュすると、各戻るボタンがスタックからポップされます。あなたができる最善の方法は、viewcontrollersのキャッシュを作成し、それらをnavcontrollerスタックからポップする限り、必要に応じてそれらを捨てることです。しかし、おそらくメモリを節約することであなたをあまり買わないでしょう。

UITableViewsは、表示されるセルの数が比較的少なく、セルが画面外になるとすぐに削除されてプールに戻されるという点で、少し異なります。チェーンの最大深度が固定されていることを保証できる場合は、同様のウィンドウスキームを使用できます。そうでない場合は、深くなることに固執し、できるだけ早くメモリを解放することに注意する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top