Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检查控制器是否已在navigationcontroller ViewController堆栈上?_Ios_Swift_Uinavigationcontroller_Uitabbar - Fatal编程技术网

Ios 如何检查控制器是否已在navigationcontroller ViewController堆栈上?

Ios 如何检查控制器是否已在navigationcontroller ViewController堆栈上?,ios,swift,uinavigationcontroller,uitabbar,Ios,Swift,Uinavigationcontroller,Uitabbar,我得到了这个错误: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported 如何检查堆栈中是否已经存在控制器,而不是推送该控制器,而是移动到该控制器 下面是我根据选项卡选择推送控制器的一些代码: func tabSelected(tab: St

我得到了这个错误:

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,动画: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")
      }
    }

所以,在ProfileViewController中,当我离开控制器时,我应该self.navigationController?.popToViewController(ProfileViewController,动画:true)?在我看来,你会消失吗?viewDidUnload?如果在
ViewDidEnglish
中弹出视图控制器,可能会导致问题。当您点击导航栏中的取消或后退按钮时,通常会执行
popViewController
。如果您正在使用UITabbarController构建选项卡栏基本应用程序,您应该执行
tabBarVC.selectedIndex=YOUR_INDEX
在控制器之间切换。如果您不使用UITabbarController,则应实现UITabbarDelegate,并在其委托方法中插入子视图,请参见您可能需要将其反转为更新版本的Swift:
mainNavigationController.viewController.contains{$0==controller}