在没有循环的情况下获取堆栈中最顶层的视图控制器

时间:2015-07-09 09:40:13

标签: ios swift uinavigationcontroller

我无法遍历我的视图控制器,因为如果当前视图控制器特别是一个,我只需要调用一个方法。如果我循环,那么所有方法都将被调用。我一直在使用这段代码:

if let viewControllers = navigationController?.viewControllers {
            for viewController in viewControllers {
                // some process
                if viewController.isKindOfClass(MyViewController) {
                    println("\(viewController) yes it is")
                } else {
                    self.navigationController?.popViewControllerAnimated(true)
                }
            }
        }

基本上,如果当前视图位于特定视图控制器上,我不希望popViewControllerAnimated。然而,由于循环,它无论如何都会被调用。如何在不进行此循环的情况下返回当前视图控制器?

2 个答案:

答案 0 :(得分:0)

您可以使用以下Obj-C方法获得第一个和最后一个:

[self.navigationController.viewControllers lastObject]; 
[self.navigationController.viewControllers firstObject];

这些方法在Swift中不可用,但可以通过扩展Array来轻松实现,以便您可以在项目中重复使用它。

extension Array {
    var lastObject: T {
        return self[self.endIndex - 1]
    }
}

答案 1 :(得分:0)

因为我需要查看当前或最顶层视图控制器是否与特定视图控制器匹配,我将self.navigationController?.visibleViewController转换为字符串并检查.rangeofString()是否包含视图控制器的名称I正在寻找。工作得很好。

更新:虽然这种方法对我有用,但@Gandalf的建议可能是一个更安全的选择。这对我也有用。