2009-07-02 10 views
7

ドリルダウンまたはドリルアップが実行されたために(ナビゲーションスタック内の)UIViewControllerが表示されているかどうかを検出する方法はありますか?UIViewController:ドリルダウンとドリルアップの検出

viewWillAppearでは、残念ながらUINavigationControllerのtopViewControllerとvisibleViewControllerは既に新しいViewControllerに設定されています。

+0

私もこれに苦しんできました。私はヘルパークラスを作成し、それを私の "スタックの" UINavigationControllerDelegateとし、 "navigationController:willShowViewController:"で見ていましたが、2つの問題があります:1)プッシュされていなくても呼び出されるようです(例えば、 - これは疑わしい)、2)これは関連コントローラのviewWillAppearの後に呼び出されます。これは、ビューが表示される前に同じスタックにいるかどうかを知る必要があるため、論理的な問題を引き起こします。このアプローチは優雅に見えたが、行き詰まりだったので、これを指摘しているだけだ。 –

答えて

0

ナビゲーションコントローラのviewControllersプロパティを見ることができませんでしたか?

+1

私は恐れています。現在のビューコントローラは常に配列内の最後の項目になります。これがプッシュされた結果として起こったのか、ポップされた別のコントローラが検出されたのかを検出することはできません。 :( – Norman

5

UINavigationControllerをサブクラス化し、プロパティdidPushViewControllerを追加できます。 pushViewControllerpopViewControllerをオーバーライドして、プロパティをそれぞれtrueまたはfalseに正しく設定できます。

+0

いいですね。見落とした方が簡単だと思っただけです。 – Norman

1

以前のビューコントローラと次のビューコントローラの概要を知りたいだけですか?または、ビューコントローラがポップされたのかプッシュされたのかを具体的に知る必要がありますか?しかし、あなたが特定のビューコントローラがポップや押されたかどうかを知っておく必要がありますか、そしてマット・ブリッジの提案が進むべき道である場合

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

:あなたはUINavigationControllerDelegateによって定義された以下のメソッドを実装することができます。

2

もう1つの方法は、クラスローカル変数としてドリルダウンしているビューコントローラを隠すことです。次に、viewWillAppearで、クラスローカル変数のいずれかがまだ設定されている場合、ドリルアップによってヒットしたことがわかります。ユーザーがどのコントローラから戻ったのか知っているので、別のロジック(ドリルダウンしたビューコントローラから変更された値を取得するなど)を行うことができます。

viewWillAppearの参照を解放してnilすることを忘れないようにして、システムをリセットして物事を正しく認識させるようにしてください。

私はこのメカニズムが気に入っていますが、ドリルダウンコントローラはマスタービューについてデリゲートとして変更をプッシュすることが多いのです。多くの場合、データは別の小さなデータで作業しているため、マスタービューコントローラ全体。多くの異なるクラスで呼び出すことができるため、再利用も容易になります。

関連する問題