Как правильно настроить UITabBarController программно с отдельными раскадровками
У меня есть три раскадровки в моем проекте. Существует основная и две отдельные раскадровки рабочего процесса. Каждая раскадровка встроена в свой собственный контроллер навигации.
Поскольку я разбил раскадровки на рабочие процессы, я должен программно добавить каждый рабочий процесс на панель вкладок. Это работает правильно.
Моя проблема возникает, когда я пытаюсь вставить представление (внутри рабочего процесса) в контроллер навигации рабочих процессов. Кажется, что контроллер навигации для рабочего процесса никогда не используется. Я подтвердил это, изменив цвет панели навигации для каждого рабочего процесса.
Я пробовал два варианта, каждый из которых настроен на рабочий процесс.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let mainStoryboard = UIStoryboard(name: "Workflow 1", bundle: nil)
let actionItemStoryboard = UIStoryboard(name: "Workflow 2", bundle: nil)
let workflow1Controller = mainStoryboard.instantiateViewController(withIdentifier: "navigationController1")
let workflow1TabItem = UITabBarItem(title: "Item 1", image: nil, selectedImage: nil)
workflow1Controller.tabBarItem = workflow1TabItem
let workflow2Controller = actionItemStoryboard.instantiateViewController(withIdentifier: "workflow2")
let workflow2TabItem = UITabBarItem(title: "Item 2", image: nil, selectedImage: nil)
workflow2Controller.tabBarItem = workflow2TabItem
self.viewControllers = [workflow1Controller, workflow2Controller]
}
Опция 1
Настройка контроллера представления вкладок так, чтобы он указывал на контроллер навигации (уверен, что это неверно, но это был тест, который я сделал). Это отображает представления, как я хочу, но не показывает элемент навигации (кнопка назад).
Вариант 2
Настройка контроллера представления вкладок так, чтобы он указывал на представление списка (см. Снимки экрана ниже). При этом отображается кнопка "Назад", но после нажатия на ячейку последний вид отображается "над" вкладками.
1 ответ
Чтобы решить эту проблему, я сделал следующее:
- Удалить навигационные контроллеры из рабочих процессов
- Создайте "MockTabController" (просто UIViewController с UITabBar, расположенным в нижней части представления)
Теперь, когда у меня есть UIViewController с UITabBar, я могу сделать так, чтобы каждое представление рабочего процесса расширяло это представление вместо UIViewController, и, таким образом, панель вкладок согласована во всем приложении (где я хочу).
Для случаев, когда рабочий процесс имеет UITableViewController, я просто встраиваю UITableViewController в ViewController как дочернее представление. Затем ViewController расширяет мой MockTabController, и в результате получается TableViewController с панелью вкладок, которая не требует каких-либо изменений для работы.
Чтобы упростить навигацию по приложению, я просто сбрасываю стек навигации обратно в начало контроллера вкладок. Щелчок по элементу панели вкладок раскручивает весь рабочий процесс, а затем запускает запуск нового рабочего процесса.