答案 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)
尽管上述所有答案(部分)都有效,但请不要忘记以下事实:
viewControllers[count - 1]
。直接访问 index
可能会导致 ⛔️ index out of range
错误并使您的应用程序崩溃!您可以在此之前执行存在检查。
count
!这可能会导致性能下降!每次调用 someCollection.count > some number
时,您实际上是在计算所有元素,并且可以计算数十万个元素,以检查它是否不为空或是否至少有一些项目。
时间复杂度 = O(n)
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)
}