Программирование
Как мы централизованно управляем UITabBar в нашем iOS-приложении
Мы можем сосредоточиться на разработке других функций вместо того, чтобы постоянно исправлять ошибки с Tab Bar-ом.
Представьте, что у вас в приложении есть десятки экранов. Некоторым из них нужно показывать Tab Bar, а другим нет. Очень сложно, если мы будем обрабатывать это на каждом экране. Это может глючить.
До того
В приложениях Stockbit панель вкладок отображается и скрывается на определенных экранах. Сначала разработчики использовали несколько разных подходов: либо с помощью hidesBottomBarWhenPushed, либо с помощью tabbar.frame, либо с установкой tabbar.isHiddenflag. Эти подходы иногда управлялись инициализатором контроллера представления, viewDidLoad(), viewWillAppear(), а иногда непосредственно перед отправкой представления. Все это разбросано по проекту, поэтому их трудно контролировать и выявлять известные проблемы, поскольку есть много сценариев ошибочного появления Tab Bar-а, когда он иногда отображается, хотя на самом деле не должен и наоборот.
Вот несколько сценариев и некоторых проблем, которые могут возникнуть при реализации этих трех подходов в одном проекте.
Пример 1
Допустим, у нас есть страница “О компании”, на которой дизайнер хочет, чтобы панель вкладок отображалась там независимо от того, отображается ли панель вкладок на предыдущем экране или нет.
Панель вкладок страницы Stream-Comment скрывается путем установки hidesBottomBarWhenPushed в значение true при пуше ее со страницы Stream. Может быть сложно отобразить панель вкладок, когда страница компании пушится со страницы Stream-Comment, даже если мы установили для hidesBottomBarWhenPushed значение false. Изображение ниже объясняет это.
Пример 2
Все еще используем поток в приведенном выше примере. Представьте, что разработчик А использует флаг tabbar.isHidden, чтобы скрыть панель вкладок на странице Stream-Comment. К сожалению, разработчик B этого не заметил и попытался отобразить панель вкладок на странице компании с помощью tabbar.frame. Любое значение, установленное в tabbar.frame, никогда не будет отображать панель вкладок, потому что в основе она скрыта 😂
Кроме того, отображение/скрытие панели вкладок с помощью tabbar.isHidden на самом деле не нравится многим разработчикам, потому что она просто появляется и исчезает в одно мгновение. Мы не можем реализовать анимацию, используя такой подход.
Пример 3
Допустим, наша страница Company — это переиспользуемое представление, на которое можно перейти из любой точки. Мы устанавливаем для tabbar.isHidden значение false и устанавливаем правильный фрейм на tabbar.frame внутри инициализатора страницы Company, чтобы он всегда отображал панель вкладок. Но, к сожалению, мы не можем контролировать, переопределяется ли tabbar.isHidden или tabbar.frame сразу после создания экземпляра страницы компании из другого класса. Это также может привести к ошибкам.
Наше решение
1. Стандартизированный метод для отображения/скрытия панели вкладок
Мы сделали расширение UITabBarController, чтобы создать метод для отображения и скрытия панели вкладок. Используется только метод setTabBarHidden(_:animated:duration:) для отображения/скрытия Tab Bar-а. Больше не нужно использовать hidesBottomBarWhenPushed, tabbar.isHidden или tabbar.frame вручную в коде.
2. Централизованное отображение/скрытие панели вкладок в одном месте
В нашем проекте у нас панель вкладок является корнем нашего основного приложения. Каждая вкладка имеет контроллер навигации. Мы создаем класс, скажем, MainTabBarNavigationManager, сопоставляем его с UINavigationControllerDelegate и устанавливаем для каждого делегата навигационного контроллера его экземпляр. Решите, должен ли View Controller, который пушится, отображать или скрывать панель вкладок внутри него.
Управление тем, какой экран должен отображать/скрывать панель вкладок, теперь осуществляется внутри MainTabBarNavigationManager.
Результат
Поскольку приложение было выпущено 5 месяцев назад до публикации этой статьи, мы не обнаружили серьезных проблем, связанных с панелью вкладок (например, отсутствие панели вкладок или внезапное отображение панели вкладок не на нужном экране). Таким образом, мы можем сосредоточиться на разработке других функций вместо того, чтобы постоянно исправлять ошибки с Tab Bar-ом.