如何在Swift中获取对以前的viewController的引用?

时间:2016-07-21 00:34:19

标签: swift uikit

有人可以帮助我获取viewController堆栈中之前UINavigationController的引用吗?我确信它是直截了当的,但我现在有点轻拍。

enter image description here

8 个答案:

答案 0 :(得分:10)

第一件事总是从索引0开始,所以要访问之前你需要减去2.如果你的访问对象的索引小于你的计数,那么你的上述代码将与Array index out of Range一起崩溃。所以检查你的情况

let count = viewControllers?.count
if count > 1 {
    if let setVC = viewControllers?[count -2] as? SWSetVC {
        //Set the value
    }
}

答案 1 :(得分:5)

你也可以使用它:

(使用swift 3)

 let i = navigationController?.viewControllers.index(of: self)
 let previousViewController = navigationController?.viewControllers[i!-1]

答案 2 :(得分:2)

⚠️记住!

尽管上述所有答案(部分)都有效,但请不要忘记以下事实:

1.请勿使用 viewControllers[count - 1]

直接访问 index 可能会导致 ⛔️ index out of range 错误并使您的应用程序崩溃!您可以在此之前执行存在检查。

2.不要使用count!这可能会导致性能下降!

每次调用 someCollection.count > some number 时,您实际上是在计算所有元素,并且可以计算数十万个元素,以检查它是否不为空或是否至少有一些项目。

<块引用>

时间复杂度 = O(n)

3.始终记住处理您编写的任何 else 语句的 if 条件。

else 状态留空(如 Nirav D 的回答)很可能会使您的应用处于未处理状态。


✅简单安全且高效的解决方案

只需从数组的末尾开始并使用此扩展名查找 topViewController 之后的下一个控制器:

extension UINavigationController {
    var previousViewController: UIViewController? { viewControllers.last { $0 != topViewController } }
}
<块引用>

时间复杂度 = O(1)

答案 3 :(得分:1)

let count = self.navigationController.viewControllers.count;
self.navigationController.viewControllers[count - 2];

答案 4 :(得分:1)

我在我的项目中使用此扩展名:

extension Array where Iterator.Element == UIViewController {

    var previous: UIViewController? {
        if self.count > 1 {
            return self[self.count - 2]
        }
        return nil
    }

}

因此您可以通过以下方式检查VC:

if self.navigationController?.viewControllers.previous is CustomVC {
    ...
} else {
    ...
}

答案 5 :(得分:1)

Swift 5 扩展以获取以前的视图控制器

扩展:

extension UINavigationController {
    var previousViewController: UIViewController? {
        guard viewControllers.count > 1 else { return nil }
        return viewControllers[viewControllers.count - 2]
    }
}

用法:

if let previousVC = self.navigationController?.previousViewController {
}

答案 6 :(得分:0)

以前的控制器似乎是controllers[count - 2],而不是controllers[count - 1]

答案 7 :(得分:0)

我喜欢使用以下函数来获取对导航堆栈中任何UIViewController的引用。如果没有这样的引用,它只会返回nil

extension UINavigationController {

    func getReferenceTo<ViewController: UIViewController>(viewController: ViewController.Type) -> ViewController? {
        return self.viewControllers.first { $0 is ViewController } as? ViewController
    }
}

用例:

func tappedBackToHomeButton() {
    guard let homeVC = self.navigationController?.getReferenceTo(viewController: HomeVC.self) else { return }
    // Pass variables if needed.
    self.navigationController?.popToViewController(homeVC, animated: true)
}