我使用此代码呈现了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。
我想做这个动画。
谢谢。
答案 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属性用于访问呈现视图 控制器。
简而言之,如果您要取消当前的UIViewController
(sourceViewController
)并展示下一个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)