2016-04-14 14 views
3

UIViewControllerがちょうどUINavigationViewControllerからプッシュされたことをどのように知ることができますか?`UIViewController`が` UINavigationViewController`からちょうどプッシュされたことをどのように知ることができますか?

私は明らかにviewDidAppearを使いたくないのです。そのメソッドは、押されたときだけでなく、そのビューが表示されるたびに呼び出されるからです。

viewDidLoad前のビューコントローラが押されると呼ばれ、私は

+1

[この図](https://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/)あなたが言及したもの以外に送信された他のイベントは表示されません。 'viewDidAppear'をブール値で使うことができます。[here](http://stackoverflow.com/questions/28207063/how-to-do-some-stuff-in-viewdidappear-only-once) – Lulylulu

+3

[UIViewController:willMoveToParentViewController](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/willMoveToParentViewController :)またはalik –

+0

残念ながらwillMoveToParentViewControllerはですコントローラがポップされたときにも呼び出されます。 – aneuryzm

答えて

0
のからこれを確認することができます

これを行う方法は複数あります。

  1. 最も簡単な方法です。コントローラーを押すときに、コントローラーにフラグを設定します。プッシュしているときは、その時点でカスタムコードを実行できます。

  2. UINavigationControllerDelegateおよびそのnavigationController:didShowViewController:animated:。ここでも、コントローラをデリゲートにすることも、外部でメソッドを呼び出すこともできます。

  3. コントローラ内部のロジック - おそらくviewDidAppearwillMoveToParentViewController:の組み合わせを使用できます。最初に、コントローラが表示されると、コントローラが押されました。その後、親コントローラの変更をリッスンするときにコントローラがナビゲーションコントローラから削除されるときに、「プッシュ」状態をリセットすることができます。あなたのユースケースはあまり明確ではありませんが、場合によっては最初のviewDidAppearコールを処理するだけで、うまくいきます。

ただし、最初の2つのオプションは実装がはるかに簡単です。それは、あなたがその出来事について知ってはいけないクラスからイベントを聴こうとしているからです。 その場合の最も賢明な解決策は、そのイベントをどこか他の場所で聞き、コントローラを外部的にに設定してそのイベントを処理することです。

+0

1.プッシュされたビューコントローラは、プッシュされたときにそれを知らないのはなぜですか? – aneuryzm

+0

2.なぜ "viewDidAppearとwillMoveToParentViewControllerの組み合わせ"と言いますか? @TomKnapenは、ビューコントローラがプッシュされたときwillMoveToParentViewControllerが呼び出されるため、ソリューション3は最も単純で最も正しいと思われます。 – aneuryzm

+0

@Patrickそれがどのように表示されたのかを知ることは、コントローラの責任ではないからです。これは、ナビゲーションコントローラまたは他のコンテナクラスの責任です。 – Sulthan

2

navigationControllerへの参照が利用できていないあなたは、ナビゲーションviewcontrollers配列

//Eg: 
//Maintain your navigation object: 
@property (strong, nonatomic) UINavigationController *navController; 

//use: 
    if([[self.navController.viewControllers lastObject] class] == [your view controoler class]) { 
    // your view controller is present in navigation stack 
} 
+0

これは単なるデモンストレーションですが、あなたの要件に沿ってこれを使用することができます。 –

+1

まず、そのナビゲーションコントローラは「弱い」必要があります。第二に、なぜあなたはクラスの平等をチェックしますか?単に 'lastObject'をそのコントローラに直接比較してください。 – Sulthan

+0

しかし、私は、追加されたばかりのビューコントローラのクラスの中にあります。 (そのため、viewDidAppearまたはviewDIdLoadについて述べました。私は、プッシュされたView Controllerクラスの内部にあります)。 – aneuryzm

0

これはviewDidAppearから行うことができます。以前のVCからプッシュすると、フラグまたはboolのステータスをtrueまたはYESに設定します。 viewDidAppearに条件を入れてください。ステータスまたはフラグが真の場合は、プッシュでやりたいことをいくつか行います。別のビューから現在のビューにポップすると、このフラグまたはステータスがNOに設定されるため、viewDidAppearの状態は実行されません。

関連する問題