2009-08-06 4 views
4

私は、ナビゲーションビュー階層のコンテキストでビューを切り替えるので、切り替え時に、新しいビューの下にプッシュされていた以前のビューを判別できるようにしたい。UINavigationControllersの以前のvisibleViewControllerをどのように決定するのですか?

私はUINavigationControllerDelegateでこれをしようとしている

(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    NSLog(@"Switching from %@ to %@", 
     NSStringFromClass([[navigationController visibleViewController] class]), 
     NSStringFromClass([viewController class]) 
    ); 
} 

私はこの取得:

2009-08-05 20:05:21.274アプリケーション名[85913:20B] からの切り替えをManagementScreen to ManagementScreen

残念ながら、「will」が呼び出される前に残念ながら、UINavigatの状態で既にスワップアウトされているようですviewControllerが渡されるようなionControllerは、UINavigationControllerのvisibleViewControllerと同じです(また、ここでは説明していませんが、同じコードで試しました)。

私はナビゲーションビューコントローラを拡張しないようにしたいと思います。正直なところ、デリゲートにプロパティを簡単に入れることはできますが、既存のフレームワーク内でこの動作が可能かどうかは疑問です。後に起こったように起こるが、ナビゲーション制御装置の状態はいずれかの前に変更されているようである)。

ありがとうございます!

+0

NSStringFromClass()を使用する方が簡単です。 –

答えて

2
- (void)navigationController:(UINavigationController*)nc 
     didShowViewController:(UIViewController*)vc 
        animated:(BOOL)animated 
{ 
    NSLog(@"Switching from %@ to %@", 
    NSStringFromClass([vc class]), 
    NSStringFromClass([[nc.viewControllers objectAtIndex:[nc.viewControllers count]-1] class])); 
} 
+0

いいえ、それは必ずしもうまくいかないことを除いて:setViewControllers ::はviewControllersプロパティを上書きします。ルートにポップしている場合は、配列の境界を控えめにします(これは避けがたいですが、コントローラースタックdunno!) – groundhog

+0

もちろん、ガードを追加する必要があります。とにかくルートをポップしてはいけません。 setViewControllersに関しては、彼は具体的に彼が彼の事件を推していたと言った。 –

5

疑問が指摘するように、私は時間によって、デリゲートが表示されますビューコントローラが既にnavigationController.topViewControllerの値であると呼ばれている、のでUINavigationControllerDelegate作品を使用答えを考えていないとnavigationController.visibleViewController。

代わりに、オブザーバを使用してください。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewControllerChange:) name:@"UINavigationControllerWillShowViewControllerNotification" object:self.navigationController]; 

ステップ2.(viewControllerChangeと呼ばれるこの例では)通知コールバックを作成し、確認するために、通知のUserInfo辞書内のキーを使用してください。UINavigationControllerWillShowViewController通知を監視するオブザーバを設定し

ステップ1最後と次のビューコントローラ:

(void)viewControllerChange:(NSNotification *)notification { 
    NSDictionary *userInfo = [notification userInfo]; 
    NSLog(@"Switching from %@ to %@", [[userInfo objectForKey:@"UINavigationControllerLastVisibleViewController"] class], [[userInfo objectForKey:@"UINavigationControllerNextVisibleViewController"] class]); 
} 
+0

これは実際に動作します。しかし、私はその通知に関する文書を見つけることができません、それは非公開ですか?アプリを提出すると困ってしまいますか?それを使用して? – leolobato

+1

Nope。トラブルにはなりません。通知はAPIの中核部分です。 Appleはこれを「Cocoa Fundamentals Guide」の「オブジェクトとのコミュニケーション」のセクションで文書化しています –

+0

Danの答えをありがとう。 UIViewControllerがもうスタックにないときにデリゲートが呼び出すことはとても悪いことです。 –

関連する問題