Найти тему
Мытарства джуна

Передача данных внутри TabBarViewController

How to pass data in UITabBarViewController

Итак, у нас есть TabBarVC с несколькими VC (к которым еще идут и NavigationControllers). Как же корректно передать данные внутри TabBarVC, чтобы при загрузки экранов все данные уже были на месте.

Приступим!

У каждого VC создаем свойство нашей модели (которую хотим передавать):

var persons: [Person]!

Это неявно извлеченный опционал (мы его обязательно инициализируем после загрузки экрана).

Затем в UITabBarViewController создаем метод, который будет инициализировать выше указанное свойство у каждого VC:

private func setupViewControllers() {
guard let viewControllers = viewControllers else { return }
let persons = Person.getPersons()
for viewController in viewControllers {
if let navigationVC = viewController as? UINavigationController {
if let personsListVC = navigationVC.topViewController as?
PersonsListViewController {
personsListVC.persons = persons
} else if let detailPersonsListVC = navigationVC.topViewController as? DetailPersonsListViewController {
detailPersonsListVC.persons = persons
}
}
}
}

И вызываем этот метод во viewDidLoad нашего TabBarViewController:

override func viewDidLoad() {
super.viewDidLoad()
setupViewControllers()
}

Итак:

  1. TabBar имеет массив VC, извлекаем его в свойство viewControllers
  2. Получаем данные из модели
  3. Затем перебираем массив  VC
  4. И так как каждый VC лежит в NavigationController, то добираемся сначала до него, а затем кастим до нужного VC
  5. У каждого VC инициализируем наше свойство