17

私は iPhone SDK の使い方を学ぶことに時間を費やしてきました。「 iPhone 開発の開始: iPhone SDK の探索」を最初から最後まで読みましたが、1 つの XIB 内に複数のビューがある例を見たことがありません。

私が言いたいことを説明するために、私が言及しているものの単純な構成を備えた XIB のスクリーンショットを次に示します。

代替テキスト http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

これを見たことがないのは、非常に具体的な理由があるに違いないと思います。Apple の例とこれまでのすべての読み物では、複数の XIB が 1 つの「ビュー」(および場合によってはナビゲーション コントローラーやタブ バー コントローラーなど) だけで使用されています。これの理由は何ですか?XIB 内で複数のビューを避けるべきですか? どちらの方法の利点または欠点は何ですか?

前もって感謝します

4

4 に答える 4

21

これは、メモリの最適化と読み込み時間の問題です。すべてのビューを1つのXIBに配置すると、アプリケーションの起動時に、XIB全体をメモリにロードし、すべてのコントロールのすべてのオブジェクトを構築する必要があります。これには、取るに足らない時間がかかります。

代わりに、ビューを別々のXIBに分割すると、最初のビューを含むXIBのみが読み込まれ、最初はメモリの使用量も少なくなるため、アプリの起動がはるかに速くなります。次に、ビューが変更されたときに、新しいビューを含むXIBを遅延ロードできます。これにより、初めてビューを開くときに小さな問題が発生します。本当にメモリ使用量を最適化しようとしている場合は、ビューを切り替えるときに前のビューをアンロードすることもできますが、これは、最初に切り替えるときだけでなく、ビューを切り替えるたびに問題が発生するため、お勧めしません。任意のビューに。

于 2009-04-19T15:08:05.330 に答える
4

前の回答に続いて、複数のビューを同時にロードしたい場合があります。次に例を示します。複数のページを含むレポートを表示していて、UIScrollView を使用してそれらを管理します。ユーザーがレポートの閲覧を終了すると、レポートを閉じてビューを閉じます。

必要な各ページの UIView とともに、XIB に UIScrollView を作成します。UIView は XIB の一部であるため、レポートが開かれると、一度にまとめてメモリに読み込まれます。2 つの UIViewController を作成し、それらを使用して、表示中のページとスクロール先のページを表示します。ユーザーがページ間を移動するとき、スクロール先のページを保持するために、スクロール先のページで UIViewController を再利用します。

これにより、ユーザーがページをめくる際の優れたパフォーマンスが保証されます。すべてのページを一度にメモリにロードします。私は 2 つの UIViewController のみを使用し、どのビューが含まれているかを変更し、それらを移動するだけです。

これには、すべてのページが 1 つの XIB にあるという大きな利点もあります。編集が簡単になり、別の XIB よりも読み込みが速くなります。一度にすべてのページをロードするためのメモリがあることを確認する必要があります。それが静的コンテンツ (私の場合など) である場合は、最適な方法です。

これを行う方法の良い例を探している場合は、このリソースが優れた出発点であることがわかりました。

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

于 2009-10-31T16:34:28.353 に答える
2

これは、1 つの XIB で 2 つのビューを使用して横向きと縦向きを実装しようとしている人への警告です (iOS 4 と Xcode 4)。私にとっては、1 つの XIB に 2 つのビューを持つことの主な欠点は、XIB 内の 1 つの UIOutlet オブジェクトをビュー コントローラー内の 1 つの UIOutlet オブジェクトにしか接続できないことです。

たとえば、横向きのビューと縦向きのビューを持つ XIB があり、両方のビューに同じインターフェイス オブジェクトが異なる位置に含まれているとします (横向きの UILabel と縦向きの UILabel など)。縦向きビューの UILabel と横向きビューのUILabel オブジェクトを、View Controller 内の単一の UILabel オブジェクトに同時にリンクすることはできません。

iOS UIViewController のドキュメント (iOS 4.3) では、画面の回転に合わせて 2 つのビューをプログラムで切り替えることにより、カスタムの横向きビューと縦向きビューを実装できることが示唆されているため、これは残念です。

これを行う方法を理解するためにかなりの時間を費やした後、1 つのビュー コントローラーに 2 つの異なるビューをアタッチすることは可能ですが、両方のビューのアウトレットが必要であることがわかりました。たとえば、私のビュー コントローラーには 2 つの UILabel オブジェクトがあります (1 つは縦向きビューの UILabel に接続するためのもので、もう 1 つは横向きビューの UILabel に接続するためのものです)。私のコードでは、ランドスケープ アウトレットを更新するたびに、ポートレート ランドスケープも更新します。

あまりエレガントではありませんが、機能します。これは 1 つの画面の単純なビュー用であるため、コントローラーとビューですべての UI オブジェクトを複製するためにメモリを大量に消費することはありません。私は再びそのようにしたプロジェクトを作成しませんが、それはそのプロジェクトにとって十分な回避策でした.

于 2011-09-25T18:43:50.417 に答える