如何在Swift中替换ViewController?

etn*_*clp 8 ios swift

我使用以下代码介绍了ViewController1:

let vc1 = ViewController1()
present(vc1, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

现在,我想在ViewController1中显示ViewController2。

@IBAction func buttonEvent(_ sender: UIButton) {
    let vc2 = ViewController2()
    self.present(vc2, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

问题是:我想在调用按钮事件时关闭当前ViewController时显示ViewContoller2。

我想同时做动画。

谢谢。

Dor*_*lan 9

您可以通过navigationController以下方法实现此目的:

guard var viewControllers = sourceViewController.navigationController?.viewControllers else { return }

// FIXME: Result of call to 'popLast()' is unused
// Pop sourceViewController
viewControllers.popLast()

// Push targetViewController
viewControllers.append(targetViewController)

sourceViewController.navigationController?.setViewControllers(viewControllers, animated: true)
Run Code Online (Sandbox Code Playgroud)

获取viewControllers在导航堆栈在第一。弹出当前并追加目标之一。然后,将堆栈设置为update viewControllers

加法

(对于不使用的人navigationController

我在给定的答案中意识到了一个可能的问题。因此,我想添加此内容。在继续之前,请检查父母的文件。我想强调这一部分:

如果接收者是容器视图控制器的子代,则此属性保存包含在其中的视图控制器。如果接收者没有父代,则此属性中的值为nil。在iOS 5.0之前的版本中,如果视图没有父视图控制器且正在呈现,则将返回呈现视图控制器。在iOS 5上,此行为不再发生。而是使用presentingViewController属性访问展示视图控制器。

简而言之,如果您要关闭当前UIViewControllersourceViewController)并显示下一个(targetViewController),则应present()presentingViewController当前位置进行呼叫。

weak var presentingViewController = self.presentingViewController

sourceViewController.dismiss(animated: true, completion: {
    presentingViewController?.present(targetViewController, animated: false, completion: nil)
})
Run Code Online (Sandbox Code Playgroud)

虽然你可能会看到这一次的转型,在该年底completionsourceViewControllerdismiss(),在presentingViewController将显示,直到targetViewController呈现。我不知道您是否期望这种行为。如果没有,我暂时无法提出解决方法。


小智 6

这对我有用

viewControllers = self.navigationController?.viewControllers
viewControllers.remove(at: viewControllers.count - 1)
self.navigationController?.setViewControllers(viewControllers, animated: true)
self.performSegue(withIdentifier: "destinationVC", sender: self)
Run Code Online (Sandbox Code Playgroud)