Отличие ч / б способа скрытия навигационной панели в iOS swift - PullRequest
5 голосов
/ 18 июня 2020

Недавно у меня возникла одна проблема. Когда в моем стеке контроллера навигации (один дочерний контроллер):

MainScreen -> ScreenA -> ScreenB -> Screenc

Итак, когда в моем Screenc я хочу скрыть панель навигации и строку состояния. Все работало нормально. Но когда я возвращаюсь к своему ScreenB, моя строка состояния и панель навигации перекрываются. Не знаю, почему это произошло. Я ищу в некоторых ответах Google и некоторых SO. Затем я получил, что isNavigationBarHidden base UIViewController, а isHidden base UIView.

Почему я скрываю как панель навигации, так и строку состояния с помощью кода ниже:

 override var prefersStatusBarHidden: Bool {
        return true
    }
 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
       self.navigationController?.navigationBar.isHidden = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
       self.navigationController?.navigationBar.isHidden = false
    }

На моем предыдущем экране проблемы со строкой состояния и панели навигации перекрываются.

Но когда я использую этот код:

 override var prefersStatusBarHidden: Bool {
            return true
        }
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isNavigationBarHidden = false
    }

Он работает хорошо. На моем предыдущем экране нет перекрытия. Почему это происходит. Есть ли какая-то конкретная c причина behid:

navigationController?.isNavigationBarHidden (vs) self.navigationController?.navigationBar.isHidden

Я очень отношусь к разработке iOS. Просто хочу понять разницу. Чтобы я мог узнать, делаю ли я что-нибудь не так.

Спасибо

1 Ответ

4 голосов
/ 18 июня 2020

Да, разница огромная. Очень хороший момент!

  • Первый грубо и незаконно проникает в интерфейс навигационного контроллера и напрямую манипулирует им. Вы не должны никогда напрямую вмешиваться в любой другой интерфейс контроллера представления: ни какао, ни ваш собственный. Только контроллер представления должен управлять своим собственным интерфейсом.

  • Второй вежливо и правильно инструктирует навигационный контроллер, как себя вести. Это «publi c API» для отображения и скрытия панели навигации. - На самом деле правильный подход - позвонить по номеру setNavigationBarHidden(_:animated:), но установка isNavigationBarHidden вызывает это за вас.

...