【发布时间】:2019-03-19 17:32:36
【问题描述】:
目前我的应用主界面如下所示:
根视图控制器本身没有任何价值,需要决定显示哪个控制器。逻辑相当复杂,但这对于这个问题并不重要。最简单的类似示例如下所示:
override func viewDidAppear(_ animated: Bool) {
var controller: UIViewController?
if !userIsAuthenticated {
let storyboard = UIStoryboard(name: "Login", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "loginController")
}
else if systemHasAlert {
let storyboard = UIStoryboard(name: "Alert", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "alertController")
}
else {
let storyboard = UIStoryboard(name: "Landing", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "defaultLandingPage")
}
guard let _controller = controller else {
return
}
navigationController?.pushViewController(_controller, animated: true )
}
(逻辑本身是象征性的,不是那么那么简单。但这足以传达这个想法。)
此控制器还为应用程序状态更改时提供稳定的“返回点”。例如用户成功登录后,我需要做的就是:
AppDelegate.shared.navigationController?.popToRootViewController(animated: false)
这会导致 Root View Controller 中的条件被重新评估并且应用程序导航到另一个视图
一般来说这没问题,但我不喜欢 3 件事:
- 此根视图暂时可见,这会破坏从一个视图到另一个视图的平滑过渡。我试图通过用
viewWillAppear替换viewDidAppear来解决它,但在这种情况下似乎根本没有发生导航 - 技术上不需要此视图
- 在概念层面上,视图控制器充当其他视图的协调器似乎是不对的。
那么有没有更好的选择来提供这样的“根级”协调器?还是根视图协调器是正确的选择,我宁愿担心正确地对其进行样式化,而不是消除它?
提前致谢
【问题讨论】: