在不使用导航控制器的情况下关闭以前的视图时,选择到新视图控制器:Swift

问题描述

你好,我对此非常恼火:

最初,我的情节提要中有很多内容。工具栏底部的每个按钮都可以连接到各种视图控制器。您可以想象,工具栏上有6个不同项目的情况非常复杂。隔离之后,每个动作都会调用self.dismiss,一切都会好起来的。

最近,我想清理情节提要。

我创建了函数

 extension UIViewController {

    func segue(StoryboardID: String) {
    let popOverVC = UIStoryboard(name: "Main",bundle: 
    nil).instantiateViewController(identifier: StoryboardID)
    popOverVC.modalPresentationStyle = UIModalPresentationStyle.fullScreen
    popOverVC.modalTransitionStyle = .crossdissolve
    self.dismiss(animated: false,completion: nil)
    print("dismissed")
    self.present(popOverVC,animated: false,completion: nil)
    print("presented")
  }

}

我所看到的是,该解散使新视图控制器不再出现。从本质上讲,它可以追溯到我在发布时提出的第一个视图控制器。我想解雇所有视图控制器,以免不断堆积视图。

谢谢

解决方法

问题是您从正在被关闭的视图控制器中显示了popOverVC,因此popOverVC永远不会在其父级被关闭时显示。

不知道您的体系结构到底如何,但是您要么需要使用delegate模式来告知父项何时进行筛选,例如:

self.dismiss(animated: true) {
    self.delegate?.didDismiss(viewController: self)
}

或者使用某种技巧来使最高级的视图控制器在当前视图被消除后显示您的popOverVC,例如:

self.dismiss(animated: true) {
    var topController: UIViewController = UIApplication.shared.windows.filter{$0.isKeyWindow}.first!.rootViewController!
    while (topController.presentedViewController != nil) {
        topController = topController.presentedViewController!
    }
    topController.present(popOverVC,animated: true)
}

但是我同意@ Paulw11,对于您要执行的操作,UITabBarController似乎是一个更好的选择。