web-dev-qa-db-ja.com

ナビゲーションコントローラーが押されているか、ルートビューコントローラーであるかを確認するにはどうすればよいですか?

現在使用しているビューコントローラーがルートビューコントローラーであるか、ナビゲーションコントローラーでプッシュされているかを確認したいと思います。

14
Bhumi Goklani

[self.navigationController viewControllers];

スタック上のすべてのviewControllerの配列を返します。この配列の最初の要素を比較するだけで、コントローラーがルートであるかどうかを確認できます。

例えば.

UIViewController *vc = [[self.navigationController viewControllers] firstObject];

if([vc isEqual: <viewController to check> ])
{
    // code here
}

編集:Swiftを追加

let vc = self.navigationController?.viewControllers.first
if vc == self.navigationController?.visibleViewController {
    //Code Here
}
14

ナビゲーションコントローラーを介してビューコントローラーをプッシュすると、スタック上のこれらのビューコントローラーが管理されます。スタックはラストインファーストアウトの方法で維持されます。したがって、現在のビューコントローラがルートコントローラである場合、スタック内に存在できるオブジェクトは1つだけです。このコードを介してそのスタックを確認できます

if([self.navigationController.viewControllers count] == 1)  {  
   //Current view controller is root controller  
}
9
Gandalf

現在のViewコントローラーのviewDidLoadで、self.navigationController.viewControllers.count == 1をチェックするだけで、現在ナビゲーションスタックのルートビューにいることを意味します。ビューコントローラを提示していないことを確認してください。

if(self.navigationController.viewControllers.count == 1)
{
    //do what you want
}

@Simonの回答に関して、ドロワーメニューを使用していることを確認するために、私の回答を追加します。これは、正確なルートビューコントローラーの確認を見つけるのに役立つ場合があります。

- (BOOL) checkImRoot:(id)controller {
    if(self.window.rootViewController) {
        if(self.window.rootViewController == (UIViewController *)controller) {
            return YES;
        }
    }
    return NO;
}

たとえば、このメソッドをアプリデリゲートファイルに追加し、次のように呼び出して確認します。

if([[AppDelegate shareDelegate] checkImRoot:self]) {
     //Yeah, I'm a root vc
}else{
     //Noo, I'm a child vc
}
2
Hemang