Как правильно настроить 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 Раскадровка Рабочий процесс 1 Раскадровка

Рабочий процесс 2 Раскадровка Рабочий процесс 2 Раскадровка

1 ответ

Решение

Чтобы решить эту проблему, я сделал следующее:

  • Удалить навигационные контроллеры из рабочих процессов
  • Создайте "MockTabController" (просто UIViewController с UITabBar, расположенным в нижней части представления)

Теперь, когда у меня есть UIViewController с UITabBar, я могу сделать так, чтобы каждое представление рабочего процесса расширяло это представление вместо UIViewController, и, таким образом, панель вкладок согласована во всем приложении (где я хочу).

Для случаев, когда рабочий процесс имеет UITableViewController, я просто встраиваю UITableViewController в ViewController как дочернее представление. Затем ViewController расширяет мой MockTabController, и в результате получается TableViewController с панелью вкладок, которая не требует каких-либо изменений для работы.

Чтобы упростить навигацию по приложению, я просто сбрасываю стек навигации обратно в начало контроллера вкладок. Щелчок по элементу панели вкладок раскручивает весь рабочий процесс, а затем запускает запуск нового рабочего процесса.

Другие вопросы по тегам