prefersStatusBarHidden не обновляется после вызова setNeedsStatusBarAppearanceUpdate () - PullRequest
0 голосов
/ 30 июня 2018

Различные 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

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Обновление строки состояния должно быть в главном потоке.

Существует два способа обеспечить:

Добавить наблюдателя уведомлений в основной поток: (вам не нужно выставлять функцию для objc c):

NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "updateStatusBar"), object: nil, queue: .main, using: updateStatusBar)

func updateStatusBar(_ notification: Notification) {
    setNeedsStatusBarAppearanceUpdate()
}

Или обновить строку состояния в главном потоке:

NotificationCenter.default.addObserver(self, selector: #selector(updateStatusBar(_:)), name: NSNotification.Name(rawValue: "updateStatusBar"), object: nil)

@objc func updateStatusBar(_ notification: Notification) {

    DispatchQueue.main.sync {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}
0 голосов
/ 01 июля 2018

@ Зомби ответ об обновлении в основном потоке сработал на 100%. С другой стороны, он также предложил использовать символические контрольные точки для диагностики проблемы. Он предоставил отличную ссылку, чтобы помочь:

Символические точки останова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...