有人可以帮助我viewController在UINavigationController堆栈中获得前一个参考吗?我确信这是直截了当的,但我现在有点轻拍.
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)
尽管上述所有答案都有效(部分),但不要忘记以下事实:
\nviewControllers[count - 1].index直接访问可能会导致\xe2\x9b\x94\xef\xb8\x8f index out of range错误并导致应用程序崩溃!您可以在此之前执行存在性检查。
count!它可能会导致性能下降!每次调用时someCollection.count > some number,您实际上都在计算所有元素,并且可以计算数十万个元素,只是为了检查它是否不为空或至少有一些项目。
\n\n时间复杂度 = O(n)
\n
else任何语句的条件if。将状态留空(如Nirav Delse的回答)很可能会使您的应用程序处于未处理状态。
只需从数组末尾开始,然后topViewController使用以下扩展名查找下一个控制器:
extension UINavigationController {\n var previousViewController: UIViewController? { viewControllers.last { $0 != topViewController } }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n时间复杂度 = O(1)
\n
你也可以用这个:
(使用swift 3)
let i = navigationController?.viewControllers.index(of: self)
let previousViewController = navigationController?.viewControllers[i!-1]
Run Code Online (Sandbox Code Playgroud)
我在我的项目中使用这个扩展:
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)