如何正确使用popToViewController?
How to properly use popToViewController?
我想做的是将所有以前的视图控制器从堆栈弹出到 'menu' 控制器。我有一段代码应该这样做,但是当单击 'menu' 时,应用程序崩溃了。
崩溃原因:“试图弹出到不存在的视图控制器。”
这是我的部分代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// 0 = menu
if indexPath.row == 0 {
let vcName = identities[indexPath.row]
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
let _ = navigationController?.popToViewController(viewController!, animated: true)
} else {
let vcName = identities[indexPath.row]
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)
}
}
您无法实例化您尝试弹出的视图控制器的新实例;您需要弹出导航堆栈中的实际实例。
如果您的菜单是导航堆栈的根目录,那么您可以使用 popToRootViewController
。如果它在堆栈中的其他地方,那么您要么需要保留对它的引用,要么可以遍历导航控制器的 viewControllers
数组来找到它,然后弹出它。
if let navController = self.navigationController {
for controller in navController.viewControllers {
if controller is MenuController { // Change to suit your menu view controller subclass
navController.popToViewController(controller, animated:true)
break
}
}
}
我想做的是将所有以前的视图控制器从堆栈弹出到 'menu' 控制器。我有一段代码应该这样做,但是当单击 'menu' 时,应用程序崩溃了。
崩溃原因:“试图弹出到不存在的视图控制器。”
这是我的部分代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// 0 = menu
if indexPath.row == 0 {
let vcName = identities[indexPath.row]
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
let _ = navigationController?.popToViewController(viewController!, animated: true)
} else {
let vcName = identities[indexPath.row]
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)
}
}
您无法实例化您尝试弹出的视图控制器的新实例;您需要弹出导航堆栈中的实际实例。
如果您的菜单是导航堆栈的根目录,那么您可以使用 popToRootViewController
。如果它在堆栈中的其他地方,那么您要么需要保留对它的引用,要么可以遍历导航控制器的 viewControllers
数组来找到它,然后弹出它。
if let navController = self.navigationController {
for controller in navController.viewControllers {
if controller is MenuController { // Change to suit your menu view controller subclass
navController.popToViewController(controller, animated:true)
break
}
}
}