在没有导航控制器的情况下关闭前一个视图控制器的同时转到新视图控制器:swift

Segueing to New View Controller while Dismissing previous without navigation controller: swift

你好,我对此很恼火:

最初,我的故事板中有很多转场。工具栏底部的每个按钮都会连接到各种视图控制器。可以想象,工具栏上有 6 个不同项目的很多 segue。 segueing之后,每个动作都会调用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 模式来告诉父级何时进行 segue,例如:

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

或者使用一些技巧让最顶层的视图控制器在当前视图被关闭后显示您的 popOverVC,例如:

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

但我同意 @Paulw11 的观点,UITabBarController 似乎是您尝试做的事情的更好选择。