【问题标题】:How to check if navigation controller is pushed or is a root view controller?如何检查导航控制器是被推送还是根视图控制器?
【发布时间】:2014-12-09 11:38:20
【问题描述】:

我想检查我所在的视图控制器是根视图控制器还是被推送到某个导航控制器上。

【问题讨论】:

  • 检查 self.navigationController.viewControllers 它会给你推送的导航视图控制器数组
  • 你可以使用self.navigationController.topViewController == self来判断是不是rootViewController

标签: ios objective-c push navigationcontroller


【解决方案1】:

[self.navigationController viewControllers];

将返回堆栈上所有视图控制器的数组。只需比较此数组中的第一个元素即可查看控制器是否为根。

例如

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 个元素时,仍然在堆栈顶部存在一个根视图控制器!
  • @RobP - 我同意根控制器将生活在堆栈的第 0 个索引处,即使堆栈具有 >1 个元素。但是作为当前视图控制器,即 topViewController 只有在它是堆栈中唯一的控制器时才能成为 root。在堆栈 >1 元素的情况下,topViewController 将始终与根控制器不同。在这个答案中,Simon 正在检查特定视图控制器是否等于根控制器,这不是要问的问题。
  • @Gandalf 提出的问题是,给定的 viewController 是否是根目录。这是我已经回答的。还有其他方法可以做到这一点,但这不是错误的
  • @SimonMcLoughlin - 不,我并不是说它不正确,但问题是 “如果我所在的视图控制器是 root”,这意味着当前或 topViewController 或导航堆栈中的最后一个对象。要成为 root,它必须是堆栈的 firstObject,因为 root 将始终位于第 0 个索引处。我希望你明白我的意思。
  • 问题是“当前”的定义——它应该意味着“代码当前正在执行”。不是“当前是最顶层或可见的”
【解决方案2】:

每当您通过导航控制器推送任何视图控制器时,它都会在以后进先出方式维护的堆栈上管理这些视图控制器。因此,如果您当前的视图控制器是根控制器,那么堆栈中只能有一个对象。您可以通过此代码检查该堆栈

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

【讨论】:

  • 节省了我的时间。伟大
【解决方案3】:

在您当前的视图控制器的 viewDidLoad 中,只需检查 self.navigationController.viewControllers.count == 1 表示您当前处于导航堆栈的根视图中。确保您没有展示视图控制器。

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

【讨论】:

    【解决方案4】:

    关于@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
    }
    

    【讨论】:

    • 你没有多余的self.window.rootViewController吗?!这是一个错误吗?
    • 不。这不是一个错误。我只是访问window 属性。
    • 我还是不明白。您可以使用第 2 行来编写它......如果它不是真的,那么只需返回 nil。为什么要多出一行?!
    • @Honey,rootViewController 是什么nil?那么我们的比较可能会使我们的代码崩溃。
    • 哈,你说得对。我来自 Swift 世界,rootViewController 是可选的...
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多