如何检查控制器是否已经在导航控制器视图控制器堆栈上?

how to check if controller is already on navigationcontroller viewcontrollers stack?

我收到这个错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported

如何检查堆栈中是否已经存在控制器而不是推送该控制器而是移动到它?

这是我根据选项卡选择推送控制器的一些代码:

func tabSelected(tab: String) {
    switch tab{
    case "payment":
        mainNavigationController.popToViewController(myAccountViewController, animated: true)
    break
    case "delivery":
        mainNavigationController.pushViewController(deliveryViewController, animated: true)
        break
    case "service":
        mainNavigationController.pushViewController(serviceViewController, animated: true)
        break
    case "profile":
        mainNavigationController.pushViewController(profileViewController, animated: true)
        break
    default:
        break
    }
}

您可以查看导航控制器的viewControllers 属性。

if contains(mainNavigationController.viewControllers, controller) {
  // move it
} else {
  // push it
}

您似乎正在将同一个控制器推送到您的导航堆栈。您不能将视图控制器推送到堆栈中已经存在的堆栈上。可能是你多次调用你的tabSelected()方法,所以你应该确保它不会被多次调用。

防止崩溃的一个好习惯是弹出现有的控制器, 已经在堆栈中。所以当你离开你的视图控制器时,你应该做类似 self.navigationController?.popToViewController(myViewController, animated: true) 的事情。

或者您可以执行以下操作来检查堆栈中已有的控制器:

 if (self.navigationController?.topViewController.isKindOfClass(ViewController) != nil) {

}

针对您的具体情况,执行以下操作:

if(mainNavigationController.topViewController.isKindOfClass(ProfileViewController) != nil) {

    }

要检查导航堆栈中是否存在视图控制器,您可以使用以下方法。这将在 Swift 5:

中编译
    if let stack = self.navigationController?.viewControllers {
      for vc in stack where vc.isKind(of: SomeViewController.self) {
        debugPrint("exists")
      }
    }