如何在Swift中替换ViewController?

时间:2017-12-01 08:22:45

标签: 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, animated: true, completion: nil)
}

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

我想做这个动画。

谢谢。

4 个答案:

答案 0 :(得分:5)

您可以通过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)

首先在导航堆栈中获取viewControllers。弹出当前并追加目标。然后,将堆栈设置为更新的viewControllers

附加

(对于那些不使用navigationController

的人

我在给定答案中意识到可能存在问题。因此,我想做这个补充。继续之前检查documentation of parent。我想强调这一部分:

  

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

简而言之,如果您要取消当前的UIViewControllersourceViewController)并展示下一个targetViewController),您应该从present()拨打电话presentingViewController当前的{1}}。

weak var presentingViewController = self.presentingViewController

sourceViewController.dismiss(animated: true, completion: {
    presentingViewController?.present(targetViewController, animated: false, completion: nil)
})

虽然您可能会在completion sourceViewController的{​​{1}}结束时看到此次转换,但dismiss()会一直显示提出了presentingViewController。我不知道你是否期望这种行为。如果不是,我现在无法提出解决方法来防止这种情况发生。

答案 1 :(得分:2)

这对我有用

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

答案 2 :(得分:0)

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

https://fluffy.es/how-to-transition-from-login-screen-to-tab-bar-controller/

答案 3 :(得分:0)

var viewControllers = self.navigationController?.viewControllers
viewControllers[viewControllers.count - 1] = newViewController
self.navigationController?.setViewControllers(viewControllers!, animated: true)