应用挂起时主导航栏消失
Main Navigation Bar Disappears When the App Is Suspended
我有一个具有以下结构的应用程序:
- 我的应用程序的根目录是一个主场景,其中包含一个由我的顶级导航控制器管理并显示导航栏的基本视图控制器。
- 我有第二个场景,容器视图占据了整个屏幕。
- 容器视图中嵌入了另一个带有附加视图控制器和自己的导航栏的导航控制器。
- 为了避免同时显示两个导航栏,我在容器视图控制器中隐藏和取消隐藏主导航栏,如下面的代码所示。
- 我从主场景导航到嵌入式场景并返回。
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
}
只要我不离开应用程序,它就可以正常工作。 如果应用程序在显示嵌入式视图时被关闭,则会发生以下情况:嵌入式导航栏仍然可见,但当我 return 到主视图时,它的导航栏消失了。
在主场景中取消隐藏它的其他尝试不会将其恢复。 如何让导航栏显示?
附带说明,如果您想查看更详细的设置,请参阅 。
更新:
这很奇怪。我找到了三种隐藏导航栏的方法,在大多数情况下它们似乎都能完成这项工作:
navigationController?.isNavigationBarHidden = true
navigationController?.setNavigationBarHidden(true, animated: false)
navigationController?.navigationBar.isHidden = true
最后一个是我用来确保该栏在应用程序恢复后保持隐藏状态的方法(请参阅上文 applicationDidBecomeActive()
)。用其他两个选项中的任何一个替换它都可以解决问题。与嵌入式导航控制器无关。
我还不敢 post 这个作为答案,因为我无法真正解释它。如果有人可以,我会很乐意接受答案。
问题似乎是所有提到的三种方法都能够从视图中隐藏导航栏,但第三个选项设置的 属性 与其他两个不同。
因此,使用 navigationController?.navigationBar.isHidden = true
隐藏栏然后尝试使用 self.navigationController?.setNavigationBarHidden(false, animated: true)
取消隐藏是行不通的。无论哪种方式保持一致都可以解决问题。
我有一个具有以下结构的应用程序:
- 我的应用程序的根目录是一个主场景,其中包含一个由我的顶级导航控制器管理并显示导航栏的基本视图控制器。
- 我有第二个场景,容器视图占据了整个屏幕。
- 容器视图中嵌入了另一个带有附加视图控制器和自己的导航栏的导航控制器。
- 为了避免同时显示两个导航栏,我在容器视图控制器中隐藏和取消隐藏主导航栏,如下面的代码所示。
- 我从主场景导航到嵌入式场景并返回。
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
}
只要我不离开应用程序,它就可以正常工作。 如果应用程序在显示嵌入式视图时被关闭,则会发生以下情况:嵌入式导航栏仍然可见,但当我 return 到主视图时,它的导航栏消失了。
在主场景中取消隐藏它的其他尝试不会将其恢复。 如何让导航栏显示?
附带说明,如果您想查看更详细的设置,请参阅
更新: 这很奇怪。我找到了三种隐藏导航栏的方法,在大多数情况下它们似乎都能完成这项工作:
navigationController?.isNavigationBarHidden = true
navigationController?.setNavigationBarHidden(true, animated: false)
navigationController?.navigationBar.isHidden = true
最后一个是我用来确保该栏在应用程序恢复后保持隐藏状态的方法(请参阅上文 applicationDidBecomeActive()
)。用其他两个选项中的任何一个替换它都可以解决问题。与嵌入式导航控制器无关。
我还不敢 post 这个作为答案,因为我无法真正解释它。如果有人可以,我会很乐意接受答案。
问题似乎是所有提到的三种方法都能够从视图中隐藏导航栏,但第三个选项设置的 属性 与其他两个不同。
因此,使用 navigationController?.navigationBar.isHidden = true
隐藏栏然后尝试使用 self.navigationController?.setNavigationBarHidden(false, animated: true)
取消隐藏是行不通的。无论哪种方式保持一致都可以解决问题。