是否可以 prepare/reset 场景在显示之前/在 viewDidAppear / viewDidLoad 之前?

Is it possible to prepare/reset a scene before it is shown / before viewDidAppear / viewDidLoad?

我有一个带有几个动画按钮的 viewController,当用户按下一个按钮时,背景是模糊的(动画)和一个可以选择几个东西的菜单(都转到一个新的viewController) 呈现。

所以基本上有一个场景,用户打开菜单,除了菜单之外的场景是模糊的,用户按下一个按钮,另一个 viewController 通过 crossDissolve 以编程方式显示。这就是我展示新控制器的方式:

let storyboard = UIStoryboard.init(name: "Timer", bundle: nil)
let vc = storyboard.instantiateInitialViewController()!
vc.modalTransitionStyle = .crossDissolve
present(vc, animated: true, completion: nil)

到目前为止一切顺利,但我无法重置原始场景(基本上只是移除模糊并重置动画按钮)。我在其中有一个名为 setupScene() 的函数,它为应用程序启动准备一切(一些按钮被隐藏,模糊的 alpha 为 0,等等......)。

我只是这样关闭新的 viewController:

dismiss(animated: true, completion: nil)

然后再次显示原始场景及其最后状态(模糊等)。

所以当新的 viewController 出现时,我想在后台重置原始 viewController 中的所有内容,这样当新的 viewController 被关闭时,旧场景是已经重置,但这不起作用。我试图在 viewDidAppear 中移动 setupScene() 函数,但首先在 viewDidAppear 或 viewDidLoad 中,新的 viewController 被取消,显示原始 viewController 处于最后状态,再次模糊,然后是 setupScene()运行以重置所有内容(这显然工作正常)。

有没有办法在显示新 viewController 或 crossDissolve 为 运行 时在后台重置所有内容?

有多种解决方案,具体取决于您想要的花哨程度。

根据您的描述,我认为首先要尝试的是利用 dismiss(animated:completion:)

中的 completion 参数

这是在关闭完成后对您的代码的回调。这将允许您反转动画。

回调不带参数。

因此,如果您的 setupScene() 方法如其所言,

dismiss(animated: true, completion: {
    setupScene()
})

应该做。

这听起来像是 viewWillAppear 的一个很好的例子。这是一个生命周期方法,当视图控制器的视图的可见性发生变化时调用。 viewDidLoad 只被调用一次。