Различные vcs внутри моего приложения показывают строку состояния видимой, а другие скрыты. Это установлено в YES в info.pList
"View controller-based status bar appearance": YES
// also tried togging this between yes and no
"Status bar is initially hidden": YES
Приложение имеет 2 окна, главное окно и второе окно. Второе окно отображается в передней части главного окна нажатием кнопки. У vc во втором окне скрыта строка состояния.
Проблема в том, что если я нахожусь на виртуальном канале (mainVC) внутри главного окна, которое показывает строку состояния, я нажимаю кнопку, чтобы показать второе окно, строка состояния mainVC исчезает. Представляется второе окно, и после того, как я его закрываю, я отправляю mainVC уведомление для вызова setNeedsStatusBarAppearanceUpdate()
, но prefersStatusBarHidden
не запускается, поэтому строка состояния остается скрытой, даже если это не должно быть. Я даже вложил в подкласс Navigation Controller и добавил туда код с mainVC как его root.
Почему бы prefersStatusBarHidden
не позвонить?
Я добавил prefersStatusBarHidden
внутри mainVC сам по себе, nav к mainVC сам по себе, а затем и в mainVC, и в его nav одновременно. Он по-прежнему не вызывается после того, как setNeedsStatusBarAppearanceUpdate()
будет вызван в любом месте.
Навигация в подклассе:
class MainVCNavController: UINavigationController {
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
NotificationCenter.default.addObserver(self, selector: #selector(updateStatusBar), name: NSNotification.Name(rawValue: "updateStatusBar"), object: nil)
}
let statusBarHidden: Bool = false
@objc func updateStatusBar() {
self.setNeedsStatusBarAppearanceUpdate() // this gets called when the notification is triggered
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden // this doesn't get called after setNeedsStatusBarAppearanceUpdate() is called
}
// I added this just to see if it would make a difference but it didn't
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
override open var childViewControllerForStatusBarStyle: UIViewController? {
return self.topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return self.topViewController
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
}
MainVC является корневым VC вышеуказанного nav
class MainVCController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(updateStatusBar), name: NSNotification.Name(rawValue: "updateStatusBar"), object: nil)
}
let statusBarHidden: Bool = false
@objc func updateStatusBar() {
self.setNeedsStatusBarAppearanceUpdate() // this gets called when the notification is called
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden // this doesn't get called after setNeedsStatusBarAppearanceUpdate() is triggered
}
// I added this just to see if it would make a difference but it didn't
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
}
SecondVC во втором окне скрывает строку состояния. Он отправляет уведомление при отклонении на указанный выше mainVC:
class SecondController: UIViewController {
override var prefersStatusBarHidden: Bool {
return true
}
if dismissed {
NotificationCenter.default.post(name: Notification.Name(rawValue: "updateStatusBar"), object: nil)
}
}
Я также прочитал, что мне нужно вызвать нижеприведенное, чтобы вызвать prefersStatusBarHidden
, но даже когда я добавил их к updateStatusBar()
, это не имело значения.
navigationController?.setNavigationBarHidden(false, animated: false)
// or
navigationController?.navigationBar.isHidden = false