Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中替换ViewController?_Ios_Swift - Fatal编程技术网

Ios 如何在Swift中替换ViewController?

Ios 如何在Swift中替换ViewController?,ios,swift,Ios,Swift,我使用以下代码演示了ViewController1: let vc1 = ViewController1() present(vc1, animated: true, completion: nil) 现在,我想在ViewController1中显示ViewController2 @IBAction func buttonEvent(_ sender: UIButton) { let vc2 = ViewController2() self.present(vc2, anima

我使用以下代码演示了ViewController1:

let vc1 = ViewController1()
present(vc1, animated: true, completion: nil)
现在,我想在ViewController1中显示ViewController2

@IBAction func buttonEvent(_ sender: UIButton) {
    let vc2 = ViewController2()
    self.present(vc2, animated: true, completion: nil)
}
问题是:我想在调用按钮事件时取消当前ViewController时显示ViewController2

我想在这样做的同时制作动画


谢谢。

您可以通过以下
导航控制器来实现:

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

// Popped ViewController not used
_ = viewControllers.popLast()

// Push targetViewController
viewControllers.append(targetViewController)

sourceViewController.navigationController?.setViewControllers(viewControllers, animated: true)
首先在导航堆栈中获取
viewControllers
。弹出当前文件并附加目标文件。然后,将堆栈设置为更新的
viewControllers

添加物 (适用于不使用导航控制器的用户)

我意识到在给出的答案中可能有一个问题。因此,我想补充一下。检查后再继续。我想强调这一部分:

如果收件人是容器视图控制器的子级,则 属性保存它所包含的视图控制器。如果 收件人没有父项,此属性中的值为零。之前 iOS 5.0,如果视图没有父视图控制器并且正在 呈现时,将返回呈现视图控制器。在iOS 5上, 这种行为不再发生。相反,使用 presentingViewController属性以访问演示视图 控制器

简而言之,如果要关闭当前的
UIViewController
sourceViewController
)并显示下一个(
targetViewController
),应该从当前的
presentingViewController
调用
present()

weak var presentingViewController = self.presentingViewController

sourceViewController.dismiss(animated: true, completion: {
    presentingViewController?.present(targetViewController, animated: false, completion: nil)
})
虽然您可能会看到这次的转换,但在
sourceViewController
完成
disclose()
结束时,
presentingViewController
将显示,直到显示
targetViewController
。我不知道你是否期待这种行为。如果没有,我现在还不能想出一个解决办法来防止这种情况

这对我有用

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

您可以在
SceneDelegate
中创建函数,修改根视图控制器,并使用
(UIApplication.shared.connectedScenes.first?.delegate as?SceneDelegate)?访问它。您的函数在此(视图:UIViewController)
。除非你的应用程序不使用导航控制器或选项卡视图,否则你可能只需要使用一个presetSegue()函数


您想要什么,在按钮上不应关闭ViewController1,并且ViewController2应与当前动画一起显示?是的,我希望ViewController2在ViewController1关闭时打开。如果我能做到,我想在这里过渡动画。你可以使用视图控制器过渡动画很好的解决方案,但我没有navigationController。