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

Aar*_*112 6 uikit swift

有人可以帮助我viewControllerUINavigationController堆栈中获得前一个参考吗?我确信这是直截了当的,但我现在有点轻拍.

在此输入图像描述

Nir*_*v D 11

第一件事总是从索引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
    }
}
Run Code Online (Sandbox Code Playgroud)


Moj*_*ini 9

\xe2\x9a\xa0\xef\xb8\x8f 请记住!

\n

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

\n

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

\n

index直接访问可能会导致\xe2\x9b\x94\xef\xb8\x8f index out of range错误并导致应用程序崩溃!您可以在此之前执行存在性检查。

\n

2.请勿使用count!它可能会导致性能下降!

\n

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

\n
\n

时间复杂度 = O(n)

\n
\n

3. 永远记住要处理你所写的else任何语句的条件if

\n

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

\n
\n

\xe2\x9c\x85 简单安全且高性能的解决方案

\n

只需从数组末尾开始,然后topViewController使用以下扩展名查找下一个控制器:

\n
extension UINavigationController {\n    var previousViewController: UIViewController? { viewControllers.last { $0 != topViewController } }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

时间复杂度 = O(1)

\n
\n


Fit*_*syu 6

你也可以用这个:

(使用swift 3)

 let i = navigationController?.viewControllers.index(of: self)
 let previousViewController = navigationController?.viewControllers[i!-1]
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 6

我在我的项目中使用这个扩展:

extension Array where Iterator.Element == UIViewController {

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

}
Run Code Online (Sandbox Code Playgroud)

所以你可以通过这种方式检查VC:

if self.navigationController?.viewControllers.previous is CustomVC {
    ...
} else {
    ...
}
Run Code Online (Sandbox Code Playgroud)