Connect with us

Программирование

Как мы централизованно управляем UITabBar в нашем iOS-приложении

Мы можем сосредоточиться на разработке других функций вместо того, чтобы постоянно исправлять ошибки с Tab Bar-ом.

Avatar photo

Опубликовано

/

     
     

Представьте, что у вас в приложении есть десятки экранов. Некоторым из них нужно показывать Tab Bar, а другим нет. Очень сложно, если мы будем обрабатывать это на каждом экране. Это может глючить.

До того

В приложениях Stockbit панель вкладок отображается и скрывается на определенных экранах. Сначала разработчики использовали несколько разных подходов: либо с помощью hidesBottomBarWhenPushed, либо с помощью tabbar.frame, либо с установкой tabbar.isHiddenflag. Эти подходы иногда управлялись инициализатором контроллера представления, viewDidLoad(), viewWillAppear(), а иногда непосредственно перед отправкой представления. Все это разбросано по проекту, поэтому их трудно контролировать и выявлять известные проблемы, поскольку есть много сценариев ошибочного появления Tab Bar-а, когда он иногда отображается, хотя на самом деле не должен и наоборот.

Как мы централизованно управляем UITabBar в нашем iOS-приложении

Отображение/скрытие панели вкладок в наших приложениях

Вот несколько сценариев и некоторых проблем, которые могут возникнуть при реализации этих трех подходов в одном проекте.

Пример 1

Допустим, у нас есть страница “О компании”, на которой дизайнер хочет, чтобы панель вкладок отображалась там независимо от того, отображается ли панель вкладок на предыдущем экране или нет.

Как мы централизованно управляем UITabBar в нашем iOS-приложении

Сценарий скрытия и отображения панели вкладок

Панель вкладок страницы Stream-Comment скрывается путем установки hidesBottomBarWhenPushed в значение true при пуше ее со страницы Stream. Может быть сложно отобразить панель вкладок, когда страница компании пушится со страницы Stream-Comment, даже если мы установили для hidesBottomBarWhenPushed значение false. Изображение ниже объясняет это.

Как мы централизованно управляем UITabBar в нашем iOS-приложении

https://stackoverflow.com/a/5641671

Пример 2

Все еще используем поток в приведенном выше примере. Представьте, что разработчик А использует флаг tabbar.isHidden, чтобы скрыть панель вкладок на странице Stream-Comment. К сожалению, разработчик B этого не заметил и попытался отобразить панель вкладок на странице компании с помощью tabbar.frame. Любое значение, установленное в tabbar.frame, никогда не будет отображать панель вкладок, потому что в основе она скрыта 😂

Кроме того, отображение/скрытие панели вкладок с помощью tabbar.isHidden на самом деле не нравится многим разработчикам, потому что она просто появляется и исчезает в одно мгновение. Мы не можем реализовать анимацию, используя такой подход.

Пример 3

Допустим, наша страница Company — это переиспользуемое представление, на которое можно перейти из любой точки. Мы устанавливаем для tabbar.isHidden значение false и устанавливаем правильный фрейм на tabbar.frame внутри инициализатора страницы Company, чтобы он всегда отображал панель вкладок. Но, к сожалению, мы не можем контролировать, переопределяется ли tabbar.isHidden или tabbar.frame сразу после создания экземпляра страницы компании из другого класса. Это также может привести к ошибкам.

Как мы централизованно управляем UITabBar в нашем iOS-приложении

На View страницы Company можно попасть из нескольких точек входа

Наше решение

1. Стандартизированный метод для отображения/скрытия панели вкладок

Мы сделали расширение UITabBarController, чтобы создать метод для отображения и скрытия панели вкладок. Используется только метод setTabBarHidden(_:animated:duration:) для отображения/скрытия Tab Bar-а. Больше не нужно использовать hidesBottomBarWhenPushed, tabbar.isHidden или tabbar.frame вручную в коде.

2. Централизованное отображение/скрытие панели вкладок в одном месте

В нашем проекте у нас панель вкладок является корнем нашего основного приложения. Каждая вкладка имеет контроллер навигации. Мы создаем класс, скажем, MainTabBarNavigationManager, сопоставляем его с UINavigationControllerDelegate и устанавливаем для каждого делегата навигационного контроллера его экземпляр. Решите, должен ли View Controller, который пушится, отображать или скрывать панель вкладок внутри него.

Как мы централизованно управляем UITabBar в нашем iOS-приложении

Пример схемы для централизованного управления отображением/скрытием панели вкладок.

Управление тем, какой экран должен отображать/скрывать панель вкладок, теперь осуществляется внутри MainTabBarNavigationManager.

Результат

Поскольку приложение было выпущено 5 месяцев назад до публикации этой статьи, мы не обнаружили серьезных проблем, связанных с панелью вкладок (например, отсутствие панели вкладок или внезапное отображение панели вкладок не на нужном экране). Таким образом, мы можем сосредоточиться на разработке других функций вместо того, чтобы постоянно исправлять ошибки с Tab Bar-ом.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: