【发布时间】:2018-02-28 10:12:17
【问题描述】:
我有一个具有以下结构的应用程序:
- 我的应用程序的根目录是一个主场景,其中有一个基本视图控制器,由我的顶级导航控制器管理并显示一个导航栏。
- 我有第二个场景,容器视图占据了整个屏幕。
- 嵌入在容器视图中的是另一个导航控制器,带有额外的视图控制器和自己的导航栏。
- 为避免同时显示两个导航栏,我在容器视图控制器中隐藏和取消隐藏主导航栏,如下面的代码所示。
- 我从主场景导航到嵌入场景并返回。
override func viewDidLoad() {
super.viewDidLoad()
// Get notified when app is resumed.
NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
// Hide main navigation controller's top bar.
navigationController?.setNavigationBarHidden(true, animated: true)
}
override func viewWillDisappear(_ animated: Bool) {
// Show main navigation controller's top bar when leaving split view.
self.navigationController?.setNavigationBarHidden(false, animated: true)
super.viewWillDisappear(animated)
}
func applicationDidBecomeActive() {
// Hide main navigation controller's top bar after returning to app.
navigationController?.navigationBar.isHidden = true
}
只要我不离开应用程序,它就可以正常工作。 如果应用在显示嵌入视图时被关闭,会发生以下情况:嵌入的导航栏仍然可见,但当我返回主视图时,它的导航栏消失了。
在主场景中取消隐藏它的其他尝试不会将其恢复。 如何让导航栏显示?
附带说明,如果您想查看previous question 中描述的更详细设置。
更新: 这很奇怪。我找到了三种隐藏导航栏的方法,在大多数情况下它们似乎都可以完成这项工作:
navigationController?.isNavigationBarHidden = true
navigationController?.setNavigationBarHidden(true, animated: false)
navigationController?.navigationBar.isHidden = true
最后一个是我用来确保应用程序恢复后栏保持隐藏状态(参见上面的applicationDidBecomeActive())。用其他两个选项中的任何一个替换它可以消除问题。它与嵌入式导航控制器无关。
我还不敢将此作为答案发布,因为我无法真正解释它。如果有人可以,我很乐意接受答案。
【问题讨论】:
-
viewDidLoad在视图加载并准备就绪时调用一次,但viewWillDisappear总是在视图消失时调用。尝试将代码从 viewDidLoad 移动到 VC 的viewWillAppear方法中 - 这可能会有所帮助:) -
感谢您的建议。我刚刚尝试过,不幸的是它没有帮助。这可能是隐藏酒吧的更好地方。但问题确实是在导航回主视图时再次出现。
-
其他:你可以为这个通知添加Observer你的控制器:
UIApplicationWillEnterForeground并在与之相关的选择器中处理栏的显示/隐藏。 -
实际上,我也在听那个隐藏栏的事件。没有它,主导航栏会在恢复时返回,我会得到双栏。但也许你是对的,这导致了问题。那么问题是:我应该如何隐藏它。我在问题中添加了这个细节。
标签: ios swift uinavigationcontroller uinavigationbar uicontainerview