2011-02-02 14 views
1

私は既にiPhoneとiPadアプリをいくつか作成しましたが、別のサポートAPI、またはCocos2dのようなオープンソースライブラリを使ってシーン管理や画面遷移をサポートしています。私はこれらの外部APIなしでと考えられる画面/シーン/ビュー管理がどのようにであるかをかなり分かったような気がしません。誰かが非常に簡単にできるのですが、アプリが画面遷移をどのように管理するか、そして/またはできるだけ混乱を起こさずにこれを実証する良いリファレンスを指摘する方法を明確に説明できますか?iOSのビュー管理

UIViewControllerの派生クラスを使用して、アプリケーションの画面単位の機能を分離する必要がありますか(ナビゲーションコントローラのようなマルチスクリーンアクションを処理するための機能は除く)。そして、私のアプリは本質的に、これらのビューコントローラの1つに制御を渡して、コンポーネント(ラベル、ボタン、ビューなど)でシーンを構築します。関連するView Controllerに切り替えるにはどうすればいいですか?結果としてloadViewが呼び出されるはずですか?次に、画面Bに移動するトリガが呼び出されると、自分のビューを「遷移する」ように呼び出されます。次に、他のビューコントローラを呼び出して「ビューを設定」し、それらを遷移させますか?

これを実際に説明するサンプルプログラムがあれば、できればインターフェイスビルダーを使用しない方が理想的です。

答えて

7

私は に のUIViewController派生クラスを使用する必要がありますが私のアプリの画面ごと 機能を分離しますか?

はい。

そして、私のアプリは、基本的に、そのコンポーネントと 私のシーンを構築するだろうこれらのビュー のコントローラのいずれかに 制御を引き渡すでしょうか?

はい、多くのVCはペン先からビューツリーを取得しますが、コアコントローラの責任に関心があります。モデルの変化をさまざまなビューフィールドに伝播させます。 2.ビューイベントをモデル上の適切なアクションに戻す。私はInterfaceBuilderのハングを取得することをお勧めします。それは不完全で迷惑なものですが、それはあなたに数時間の作業と大量のコードを救うことができます。

関連するビューコントローラに切り替えるにはどうすればよいですか?

いくつかの方法:あなたのVCは、ナビゲーションコントローラでホストされている場合は

  • は、[[self navigationController] pushViewController:theNextVC animated:YES]は、一般的なイディオムです。
  • VCのセット間で明確な階層がない場合は、UITabBarControllerを使用するのが最適です。
  • モーダル積み重ねを行いたい場合は、[self presentModalViewController:theNextVC animated:YES]です。 1つか2つ以上のモーダルスタックは扱いにくいです。
  • 最初のVCを提示するには4.xでウィンドウのrootViewControllerプロパティに割り当てます(アプリケーションデリゲートがこれを行うことができます)。または前の4のために、伝統的な方法は、通常、アプリケーションの代理人に見つかりました:[myMainWindow addSubview:[myInitialVC view]]
  • リンゴ提供のVC(ビデオ、フォトピッカー)には、独自のプレゼンテーション方法があります。

最初の2つの方法では、UIウィジェットは動作させたくない場合は、ナビゲーションバーまたはタブバーを非表示にして、すべてをプログラムで実行できます。

結果としてloadViewを呼び出す必要がありますか?

あなたの「私は今現れています!」ロジックはviewWillAppear:(遷移アニメーションが開始する前に呼び出され、ビューにはまだ親が存在しません)に属し、viewDidAppear:(アニメーションの後にビューが完全に表示されるときに呼び出されます)。loadViewは、ビューがすぐに必要と思われるメモリ不足の状態でビューがダンプされ、再作成が必要な場合を除き、再度呼び出されることはありません。

loadViewを他のビューツリー構築方法で完全に置き換えたい場合は、オーバーライドしてください。私はこれをやり始めましたが、めったにそうはなりません。

通常のnibローディングを依然として実行したいときには、viewDidLoadを上書きするだけでなく、独自のビューツリーの作成/後処理をしたい場合もあります。これは自分が99%の時間を費やしていることがわかります。

たとえば、画面Bに移動するトリガーが呼び出されると、自分のビューを「遷移する」ように呼び出すと、他のビューコントローラーを呼び出して「ビューを設定」し、 ?

前述のいずれかのプレゼンテーション方法を使用すると、移行が発生します。あなたがする必要があるのは、viewWill/DidAppearと友人を実装して、起こったときに通知することだけです。

"TheElements"サンプルプロジェクトを調べることができます(xcodeドキュメントで "the elements"を検索してください)。要求に応じて、nibsは使用しません。コード内のすべてを難しい方法で設定します。 TabBarControllerとNavigationControllerを使用する良い例があり、推奨される方法でVC間の責任を分けています。

+0

たくさんの言葉。参考になった場合は、それを編集してください。 – rgeorge

+0

一般的な解決策が必要なように聞こえるが、タブバーのコントローラーが私の探しているものかもしれないが、このクラスでどこでトランジションを処理するのか分かりますか?あるスクリーンから別のスクリーンに切り替えるためにselectedViewControllerプロパティを設定している場合、どこで遷移が起こりますか?また、各ウィジェットが独自のexitを行うように、私のカスタム設定をカスタマイズしたい場合は、コントローラを変更したり、exitアニメーションの終わりまでコントローラーの変更をトリガーするのを待ったりして、それらのアニメーションをトリガーする必要があります。前者の場合は、新しい画面の入り口のアニメーションを遅らせる必要がありますか? – Joey

+0

もう一つの質問は、なぜ私は最初にタブバーコントローラが必要なのでしょうか?それは、移行を簡単にする組込み機能をいくつか持っていますか?なぜ私は単に私のウィンドウにcontrollerA.viewを追加しないのですか?次の画面が必要な時は、そのビューを削除してcontrollerB.viewを追加しますか?私のケースではタブバーが不可欠であるという新旧の移行の移行のいくつかの処理はありますか? – Joey

1

基本コントローラーUITabBarControllerまたはUINavigationControllerには2つの基本オプションがあります。 (あなたはUITabBarControllerの中にUINavigationControllerを置くことができますが、逆のことはできません)。

UITabBarControllerをお持ちの場合は、各タブに異なるビューコントローラ(UIViewControllerサブクラス)を割り当てるのが最も簡単です。 UITabBarControllerは、それらの間のトランジションを処理し、viewWillAppearのようなメソッドを呼び出します。

UINavigationControllerを使用して、rootViewControllerを設定します。そのビューコントローラは、[self.navigationController pushViewController:animated:]を呼び出します。これはしばしばUITableViewControllerで行われます。 UINavigationControllerはviewWillAppearのようなメソッドを呼び出します。

最後に、表示コントローラを表示するオプションは、それをモーダル表示することです。それが画面を埋めるために画面がポップアップする場所です。下から上へ、上に、またはフェードインに設定することができます。これを行うには、ビューコントローラーを作成し、-[UIViewController presentModalViewController:animated:]に電話してください。

それ以外のほとんどのビューコントローラは、一度に1つの画面上に1つずつ表示されます(iPadを除く)。サブクラスのUITableViewとUIScrollView、または単にUITableViewを使用します。各ビューコントローラはコンテナから独立している必要があります。つまり、UINavigationControllerで同じView Controllerをプッシュしたり、UITabBarController上のタブとして設定したり、モーダルで表示することができます。