【问题标题】:Swift 3 - Close current ViewController and Open new ViewControllerSwift 3 - 关闭当前的 ViewController 并打开新的 ViewController
【发布时间】:2017-05-25 22:28:19
【问题描述】:

我浏览过大量关于此的 SO 帖子,但没有一个明确说明如何在 Swift 3 中完成此任务。

简单地说,我需要关闭当前显示的视图并打开一个新的视图控制器。这样唯一打开的视图控制器将是第二个 VC

这是我尝试使用的代码,但是当我尝试这样做时,视图控制器会关闭,而其余代码不会被执行

//Close current VC
self.dismiss(animated: true, completion: nil)

//Open the new VC
let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main",bundle:Bundle.main)
let secondViewController: SecondViewController = mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)

有人可以帮帮我吗?我只需要从第一个 VC 到第二个 VC 的简单过渡并关闭第一个 VC。

【问题讨论】:

  • 你为什么要解雇当前的 VC?
  • 您解散控制器并将第二个控制器呈现给解散控制器。尝试将视图控制器呈现到 rootviewcontroller 中。
  • 正确的方法是委托给 parentVC 来解除你当前的然后预设新的,如果当前是 rootVC 然后只需使用UIApplication.shared.delegate.window再次设置 rootVC

标签: ios swift3 viewcontroller


【解决方案1】:

问题是,“self”不能呈现新的 ViewController,因为它是被解除的 ViewController。

您可以尝试拨打self.presentingViewController?.present(secondViewController, animated: true, completion: nil)

【讨论】:

    【解决方案2】:

    花了一整天后,我在 Apple 的开发者网站上找到了解决方案(link

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
              let secondVC = storyboard.instantiateViewController(identifier: "second_view_controller")
    
              secondVC.modalPresentationStyle = .fullScreen
              secondVC.modalTransitionStyle = .crossDissolve
    
              present(secondVC, animated: true, completion: nil)
    

    【讨论】:

      【解决方案3】:

      如果您从某个视图控制器呈现该视图控制器,或者它是导航或选项卡视图控制器中的视图控制器,则尝试获取最后一个可见视图控制器,代码在此链接中

      Get the current displaying UIViewController on the screen in AppDelegate.m

      否则使用此代码(我已从该链接复制)

      public extension UIWindow {
          public var visibleViewController: UIViewController? {
              return UIWindow.getVisibleViewControllerFrom(self.rootViewController)
          }
      
          public static func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
              if let nc = vc as? UINavigationController {
                  return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
              } else if let tc = vc as? UITabBarController {
                  return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
              } else {
                  if let pvc = vc?.presentedViewController {
                      return UIWindow.getVisibleViewControllerFrom(pvc)
                  } else {
                      return vc
                  }
              }
          }
      }
      

      然后从该 visibleViewController 中展示您的视图控制器 -

      //关闭当前VC

      self.dismiss(animated: true, completion: nil)
      

      //打开新的VC

      let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main",bundle:Bundle.main)
      let secondViewController: SecondViewController = mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
      window?.visibleViewController?.present(secondViewController, animated: true, completion: nil)
      

      如果您的视图控制器是根视图控制器,则将其设置为根视图控制器

      if let delegate = UIApplication.shared.delegate as? AppDelegate {
           delegate.window?.rootViewController = secondViewController
       }
      

      【讨论】:

      • 这不会回答问题,因为如果您关闭第一个也是唯一一个,您将没有可见的 viewController。
      • 我在他的问题中找不到他说视图控制器是唯一的......你可以吗?
      • 阅读标题“关闭当前的 ViewController 并打开新的 ViewController”并告诉我您在什么时候关闭任何 ViewController?您发布的内容将起作用,并且是通常的方法,但不适用于这种特殊情况。
      • @Zero3nna,我已经发布了他必须展示该视图控制器的地方,因为任何能理解这个问题的人都可以理解我的答案。
      • 这是票。非常感谢。将下一个视图设置为根控制器对我来说是什么。
      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2019-05-04
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多