現在使用しているビューコントローラーがルートビューコントローラーであるか、ナビゲーションコントローラーでプッシュされているかを確認したいと思います。
[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
}
ナビゲーションコントローラーを介してビューコントローラーをプッシュすると、スタック上のこれらのビューコントローラーが管理されます。スタックはラストインファーストアウトの方法で維持されます。したがって、現在のビューコントローラがルートコントローラである場合、スタック内に存在できるオブジェクトは1つだけです。このコードを介してそのスタックを確認できます
if([self.navigationController.viewControllers count] == 1) {
//Current view controller is root controller
}
現在の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
}