2

我想要做的是将所有以前的视图控制器从堆栈中弹出到“菜单”控制器。我有一段代码应该这样做,但是当点击“菜单”时,应用程序崩溃了。

崩溃的原因:“试图弹出一个不存在的视图控制器。”

这是我的代码的一部分:

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)
    }
}
4

1 回答 1

7

您无法实例化您尝试弹出的视图控制器的新实例;您需要弹出到导航堆栈中的实际实例

如果您的菜单是导航堆栈的根目录,那么您可以使用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
        }
    }
}
于 2017-05-22T22:20:48.243 回答