【问题标题】:Present a view controller, dismiss it and present a different one in Swift呈现一个视图控制器,关闭它并在 Swift 中呈现一个不同的视图控制器
【发布时间】:2017-09-19 20:31:59
【问题描述】:

我有一个根视图控制器,它有一个按钮,当用户按下它时,会显示另一个视图控制器。

第二个控制器有一个关闭选项,它只是返回到根视图控制器和一个按钮,当用户触摸它时,它会关闭当前视图控制器,因此它会返回根视图控制器一秒钟并呈现另一个。

转到我使用的第一个控制器:

let vc = FirstController()
self.present(vc, animated: true, completion: nil)

当我在另一个视图控制器中选择只关闭的按钮时,我会这样做。

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

因此,对于需要关闭并呈现另一个控制器的第二个控制器,我尝试了以下方法:

self.dismiss(animated: true, completion: {
    let vc = SecondController()
    self.present(vc, animated: true, completion: nil)
})

但我得到一个错误:

警告:尝试在视图不在窗口层次结构中的 上呈现 !

【问题讨论】:

    标签: ios swift swift3 presentviewcontroller


    【解决方案1】:

    只有呈现视图控制器(根)可以关闭其呈现的视图控制器(第一或第二)。 所以你需要在根视图控制器的类中调用dismiss(animated:completion:),而不是在任何其他类中:

    class RootViewController: UIViewController {
      func buttonTapped() {
        let vc = FirstViewController()
        vc.delegate = self
        present(vc, animated: true)
      }
    }
    
    extension RootViewController: FirstViewControllerDelegate {
      func firstDidComplete() {
        dismiss(animated: true) {
          let vc = SecondViewController()
          vc.delegate = self
          present(vc, animated: true)
        }
      }
    }
    
    extension RootViewController: SecondViewControllerDelegate {
      func secondDidComplete() {
        dismiss(animated: true) {
          let vc = ThirdViewController()
          present(vc, animated: true)
        }
      }
    }
    
    // and so on
    

    如果 FirstViewController 呈现其他视图控制器并且您想要其关闭动画,请按如下方式实现 FirstViewController:

    extension FirstViewController: OtherViewControllerDelegate {
      func otherDidComplete() {
        dismiss(animated: true) {
          self.delegate?.firstDidComplete()
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      发生错误是因为您在关闭 FirstController 后尝试从 FirstController 呈现 SecondController。这不起作用:

      self.dismiss(animated: true, completion: {
          let vc = SecondController()
      
          // 'self' refers to FirstController, but you have just dismissed
          //  FirstController! It's no longer in the view hierarchy!
          self.present(vc, animated: true, completion: nil)
      })
      

      这个问题和我昨天answered的一个问题很相似。

      针对您的场景进行了修改,我建议这样做:

      weak var pvc = self.presentingViewController
      
      self.dismiss(animated: true, completion: {
          let vc = SecondController()
          pvc?.present(vc, animated: true, completion: nil)
      })
      

      【讨论】:

      • 嘿,迈克,我在 SecondController() 旁边收到一个带有“调用中参数 'coder' 的 loadMissing 参数”的红旗,我不知道它的预期。
      • 我们如何在 UI 中不出现闪烁/闪烁的情况下推送新控制器,如何使过渡平滑?
      • 这段代码是否产生闪烁/闪烁?如果是这样,您可以发布一个新问题吗?谢谢。
      • 这个解决方案似乎不适用于我的情况。我必须使用协议。
      • @AmanGangurde 您是否发布了消除闪烁的问题?
      猜你喜欢
      • 2017-02-03
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2016-06-18
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多