2009-08-13 12 views
0

私はウィザードと似た一連の画面を作っていますが、ビューとその親ビューを閉じる方法を知り、すぐに 'DoneScreen 'リソースリークを心配することなく。私の見解は次のようになります。ウィザードスタイルのナビゲーションでビューを閉じて別のビューを表示

Base -> Level1 -> DoneScreen 
       -> Level2 -> DoneScreen 

レベル1のコントローラはview.xibで作成し、ベースコントローラによって

[self presentModalViewController ...] 

に示すナビゲーションコントローラです。レベル1コントローラは、特定の基準に基づいてレベル2スクリーンの代わりに表示される「DoneScreen」の作成も担当します。

ユーザが画面上のボタンをタップすると、レベル1のコントローラは、レベル2のコントローラをインスタンス化し、それが

[self.navigationController pushViewController ..] 

を介してそれを表示し、レベル2のコントローラのビューは、「次へ」ボタンを有しています。

レベル2の画面で '次へ'ボタンを押すと、現在のレベル2のビューとレベル1のビューが閉じられ、作成されてLevel2に渡される 'DoneScreen'が表示されますレベル1のコントローラ。 (部分的にコードの重複を減らすために、及び部分的にコントローラ間で責任を分離するために)レベル2のコントローラにおいて、I「はDoneScreen」は、最初のショーと

[self.navigationController popViewControllerAnimated:YES]; 

で自身を閉じるならば、レベル1コントローラのモーダルビューは上記依然として存在しています'Base'ではなく[Done]画面の下に表示されます。ベース以外のこれらのビューをすべてクリアし、 'DoneScreen'を表示するにはどうすればよいでしょうか?

シンプルでエレガントな方法でこれを行うには良い提案がありますか?

答えて

0

"iphone wizard tutorial"のgoogle検索でのみone good resultが得られました。すべてのウィザード画面ウィジェットを含む1つの長いビューを作成する方が良いアイデアかもしれないようです。

+0

レベル1〜DoneScreenの部分を同じプロジェクト内で再利用する必要があるため、「すべてを単一のビューのルート」にしなかったことに注意してください。 –

+0

ここでは、「責任の連鎖」パターンを使用して、「次の」コントローラーをLevel1のLevel2に渡すことができると考えました。しかし、私がLevel2に渡したものが格納されていて、popViewControllerAnimatedで破棄される直前に、私は次の画面を表示することができました。問題は、Level2の見解が解消されたために循環参照/メモリリークが発生するかどうかですそれ自身のコントローラーはクリーンアップを開始しますが、 'DoneScreen'がまだ表示されているので、それはできません。 –

0

スタック内で必要なビューを取得し、新しいアレイを作成し、ナビゲーションコントローラの「viewControllers」プロパティを使用してそれらをすべて一度にスワップすることを検討できます。

+0

私はそれを試みたが、私が期待したように私は 'DoneScreen'を見なかった。代わりに、私は 'Level1'画面に戻ります。 –

+0

私はそれを取り戻す - コンテンツエリアがまだ 'Level1'のものである間、 'DoneScreen'のタイトルバーエリアだけが表示されます。私がコントローラを交換した直後に、私はビューコントローラの数のチェックを行い、カウントは0を返しました。 (NSArray * controllers = [NSArray arrayWithObjects:self。nextController、nil]; \t [self.navigationController setViewController:controllers animated:NO]; \t \t \t viewControllers = [self.navigationController viewControllers]。 –

+0

ああ申し訳ありませんが、私はあなたが今言っていることを得て、レベル1がモーダルとして提示されたことに気付かなかった。 – criscokid

0

悲しいかな、私の深い知識(または不足)によって、私は1つの画面に行くことができました。状態に応じて複数のビューが使用されています。理想的ではないし、ちょっと混乱しますが、うまくいきます。あなたの助けをありがとう。