0

例えば:

  1. 「nib-v1」を使用して、initWithNibNameを使用して新しいUIVCを作成します
  2. たとえば、[(UINavigationController)nav pushViewController:myVC]を使用して表示します。
  3. myVCが使用しているNIBを「nib-v2」に変更します

私が見る限り、これは、表示される情報に2つのわずかに異なるUI画面が必要な情報をページングする場合に、多くのアプリのアプリ設計に対する「正しい」アプローチです。

たとえば、ほとんどのページはテキストですが、一部のページにも画像があります(RSSリーダーの場合、一部のRSSエントリにはテキストと画像があり、一部はテキストのみです)。

これまでは、1つのNIBファイルに2つ目の非表示の名前付きUIViewインスタンスを追加し、最初のファイルの上に重ねて、コンテキストに応じて「非表示」フラグを使用してオン/オフを切り替えました。

しかし、これは明らかに間違っており、メモリを浪費します。

ただし、NIBファイルからビューを「再ロード」する明確な方法がわかりません。initWithNibNameの魔法をなんとか再現したいと思いますか?

これは可能だと思いますが、「間違った方法」で実行すると、アプリがひどくクラッシュするだけだと確信しています。

4

5 に答える 5

7

あなたはいつでも実行することができます

[[NSBundle mainBundle] loadNibNamed:@"FileName" owner:viewController options:nil]];

しかし、これは間違いなく本当に物事を台無しにします、あなたが何をしているのかわからない場合、特にviewそれらのペン先の両方で接続されている場合

2つの異なるnibファイルからロードする2つの異なるコントローラー間でスワップするように、ビューコントローラー階層を再設計する必要があります。


または、コントローラーに、コントローラーとは関係のないさまざまなファイルからロードするスワッピングビューを管理させることもできますnibName。その場合、上記の方法でロードできます。そして、それらのアウトレット(たとえば、subviewOneおよびsubviewTwo)を異なるペン先に接続する必要があります。

于 2011-09-15T01:37:12.523 に答える
4

UINibクラスをチェックして、希望どおりに動作するかどうかを確認する必要があります。それはあなたがnibファイルをロードしてそれをメモリに保持することを可能にします。

しかし、明確にするために:nibファイル自体を変更しますか?または、nibファイルがメモリにロードされたときにその内容を変更しますか?

私の頭から離れると、最初のファイルは非常に難しいでしょう(元のファイルはアプリケーションバンドルの一部であるため、変更できません...多分それをDocumentsフォルダーにコピーして、独自のコーダー/デコーダーを作成しますか?) 2番目の方が簡単ですが、理由がわかりません。ロードされた後にviewController/viewを変更して(たとえば、awakeFromNibで)、それらの変更を保持したい場合は、後でそれらの変更をファイルに保存してください。

要するに、私はあなたが何をしたいのか正確にはわかりませんが、それを行うためのより良い方法があるかもしれないと私には高い可能性があります。

于 2011-09-15T01:35:07.867 に答える
2

私はRobに同意しますが、ペン先の交換を本当にやりたい場合は(これは、ダングリングポインターなどに簡単につながる可能性があるため、悪いことです)、新しいペン先からのビューをNSBundle's- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)optionsメソッドでロードしてビューを実行できます。自分を交換します。

むしろ、コンテンツの種類ごとに異なるビューコントローラを使用する必要があります。それらがわずかに異なる場合でも、1つの基本クラスを作成し、さまざまなバリエーションをサブクラス化することを検討できます。

于 2010-01-06T23:13:47.407 に答える
0

UIViewControllerが使用するNIBファイルを変更しないでください。NIBをUIViewControllerに接続するのは、1回限りのイベントである必要があります。隠されたビューは問題ありません。彼らは確かに明らかに間違っているわけではありません。ロード後にプログラムでビュー要素を追加することもできます。それをたくさん行っている場合は、NIBを完全にスキップして、プログラムでビューを作成できます-loadView。これらはどれでも問題ありませんが、初期化後にNIBを切り替えないでください。特定のUIViewControllerクラスに対して複数のNIBを選択することはお勧めしません。混乱しすぎです。通常、各NIBは、非常に類似した(または同一の)名前を持つ専用のUIViewControllerクラスにマップする必要があります。

関連するメモでは、以前の投稿で説明されているように、NIBの名前をUIViewControllerに移動することをお勧めします。

于 2010-01-06T23:05:31.280 に答える
0

私は同じ問題に対する答えを探しに来て、次のようにそれを解決することになりました:

UIViewController* ctrler = [[UIViewController alloc] initWithNibName:@"NewControllerNIB" bundle:nil];

// Replace previous controller with the new one
UINavigationController* nav = self.navigationController;
[nav popViewControllerAnimated:NO];
[nav pushViewController:ctrler animated:NO];

新しいコントローラーをプッシュする呼び出しが実行される前に現在のコントローラーの割り当てが解除される可能性があるかどうかはわかりませんが、これまでのところは機能しているようです(より良いアプローチでアプリを再設計するまで)

于 2012-04-03T21:05:24.663 に答える