1

アプリケーションのナビゲーションをUITabBarControllerの使用からuUINavigationControllerに変更しました。つまり、以前のソリューション(最初のバージョン)は、TabBarController-4つのViewController(1つの単純なTableView、1つの単純なカスタムビュー、および多くのオーバーレイを備えた1つのMapView)のみに基づいていました。2番目のバージョンは、UINavigationControllerのみに基づいています。

TabBarControllerの場合、それは明確で単純であり、すべてが正常に機能しました。特にMapViewは正常に機能しました。つまり、MapViewは一度(かなりの数のオーバーレイで)ロードされ、別のビューに移動してMapViewに戻ると、MapViewはまだそこにあり、オーバーレイは既にロードされて表示されています(簡単なチェック:MapViewのviewDidLoadが呼び出されました)アプリの実行ごとに1回だけ、そこにいくつかのデバッグメッセージがありました)。

ここで、ナビゲーションロジックをUINavigationControllerに変更しました。最初の外観ではすべて正常に機能しますが、ビューに移動するたびに(各ビューの)viewDidLoadが呼び出されます。特にMapViewの場合は煩わしいです。オーバーレイの読み込みは毎回実行され、時間がかかり、場合によってはアプリがクラッシュします。

OK、私の質問:

  1. これは、NavigationControllerのある種の「一般的な」動作ですか?

  2. この動作を変更して、viewDidLoadが1回だけ呼び出されるようにすることはできますか?

  3. その他-ビューの「表示シーケンス」にどのように影響を与えることができますか?

ロジックはおそらくもっと複雑だと思いますが、答えやヒントはありがたいです;)

いくつかの関連する状況:

  • TabBarとNavigationコントローラーは組み合わされていません。
  • 私はストーリーボードを使用しています。セグエはUIBで設計されており、コードでperfomSegueやprepareForSegueのような手動呼び出しはありません。1つのボタンでMapViewへのセグエがトリガーされます。
  • プッシュセグエを使用しています。
  • また、モーダルセグエを使用しようとしましたが、その動作は変更されていません。
  • ビュー間のセグエ中にviewDidUnloadが呼び出されることはありません。
  • メモリ警告を受信しませんでした。
  • シミュレータとiPhone4の両方で測定されたメモリリークはありません。
  • ナビゲーションだけを気にする非常にシンプルな一時的なプロジェクト/アプリを作成しようとしました。コーディングなしのコントローラーおよびその他のビュー、ストーリーボードのみ。それは同じ振る舞いでした。
  • 1つのビューとMapViewの間でナビゲーションボタンと戻るボタンを高速かつ定期的にタップすると、アプリがクラッシュする問題がありました。ほとんどの場合、完全に表示される前に(つまり、オーバーレイ)MapViewの戻るボタンをタップすると、アプリがクラッシュしました。1秒追加すると修正されました。MapViewのviewDidDisappearedでのdelayメソッド呼び出し。それは公正な修正ではありません、私は知っています;)
4

1 に答える 1

4

AUITabBarControllerUINavigationControllerは根本的に異なるパラダイムに基づいています。

は、各タブが互いに独立して存在し、ユーザーが表示するタブを選択できるようにすることをUITabBarController目的UIViewControllerとしています。ユーザーが別のタブに切り替えても、各タブがメモリ内に存在することが意図されているためviewDidLoad、それぞれに対して1回だけ呼び出されます。UIViewController

は、それぞれがそれ自体の上下に関連するUINavigationControllerスタックです。UIViewControllersスタックの一番上UIViewControllerは、常にユーザーに表示されるものです。aUIViewControllerがスタックにプッシュさviewDidLoadれると、メモリにロードされているために呼び出されます。トップUIViewControllerがスタックからポップされると、メモリからアンロードさviewDidUnloadれ、途中で呼び出されます(viewDidUnloadiOS6では非推奨であり、呼び出されませんが、コントローラーは引き続きメモリからダンプされます)。これが、ユーザーが特定のものをスタックにviewDidLoadプッシュするたびに呼び出される理由です。UIViewControllerUINavigationController

于 2013-03-09T14:36:01.543 に答える