Шаблон координатора в iOS
Привет ребята!
Что такое координатор?
Координатор — это системный компонент, который содержит логику навигации приложения. Паттерн был представлен Soroush Khanlou .
Зачем нужен координатор?
Преимущество использования шаблона координатора заключается в том, что мы снимаем с контроллеров ответственность за навигацию. Таким образом, мы можем увеличить их повторное использование, а также мы можем иметь навигацию по приложению в центральном месте, либо у нас есть один координатор, либо у нас есть главный координатор с детьми.
Отделение контроллеров представления от навигации по приложению может повысить удобочитаемость проекта. В больших приложениях очень важно иметь навигацию по приложению в отдельном компоненте системы, особенно если есть специализированные группы.
Цель состоит в том, чтобы иметь возможность легко изменять навигацию по логике в зависимости от ситуации. Например, у разных пользователей могут быть разные потоки, пользователи iPad или отдельное A/B-тестирование.
Основные характеристики координатора.
- У одного координатора может быть много ViewController'ов.
- У координаторов есть метод запуска, при котором они изначально отображают ViewController.
- ViewControllers имеют ссылку на координатора.
- Координатор имеет множество дочерних координаторов.
- Дочерние координаторы имеют ссылку на своего родителя.
protocol Coordinator: AnyObject {
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
func start()
}
final class AppCoordnator: Coordinator {
// 1
var childCoordinators = [Coordinator]()
// 2
var navigationController: UINavigationController
// 3
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
// 4
func start() {
let controller = StartViewController()
controller.coordinator = self
navigationController.pushViewController(controller, animated: true)
}
}
- Элемент пользовательского интерфейса, в который будут встроены ViewController.
- Внедрил элемент пользовательского интерфейса в конструктор.
- В методе start происходит инициализация ViewController и соединение с navigationController.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// ...
let navigationController = UINavigationController()
let appCoordinator = AppCoordinator(navigationController: navigationController)
appCoordinator.applicationRunnerDelegate = self
appCoordinator.start()
window?.rootViewController = appCoordinator.navigationController
// ...
}
Координаторы с UITabBarController
Чтобы извлечь выгоду из шаблона координатора, когда у нас есть UITabBarController в качестве основного компонента пользовательского интерфейса приложения, мы должны создать координатор для каждой вкладки. См. приведенный ниже пример:
final class MainTabBarController: UITabBarController {
private let dashboardCoordinator: DashboardCoordnator
private let settingsCoordinator: SettingsCoordnator
init() {
self.dashboardCoordinator = DashboardCoordnator(navigationController: NavigationController())
self.settingsCoordinator = SettingsCoordnator(navigationController: NavigationController())
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// ...
viewControllers = [
makeDashboardCoordinator(),
makeSettingsCoordinator()
]
}
private func makeDashboardCoordinator() -> UINavigationController {
let tabImage = "dashboard_tab_icon"
let icon = UITabBarItem(title: "DASHBOARD",
image: UIImage(named: tabImage)?.withRenderingMode(.alwaysOriginal),,
selectedImage: UIImage(named: tabImage))
dashboardCoordinator.navigationController.tabBarItem = icon
dashboardCoordinator.start()
return dashboardCoordinator.navigationController
}
private func makeSettingsCoordinator() -> UINavigationController {
let tabImage = "settings_tab_icon"
let icon = UITabBarItem(title: "SETTINGS",
image: UIImage(named: tabImage)?.withRenderingMode(.alwaysOriginal),
selectedImage: UIImage(named: tabImage))
settingsCoordinator.navigationController.tabBarItem = icon
settingsCoordinator.start()
return settingsCoordinator.navigationController
}
}
Отделение логики навигации от ViewControllers увеличивает связность классов и уменьшает связанность системы. Сохраняет логику навигации в центральном месте и улучшает повторное использование и тестируемость.
Для любых комментариев или предложений или чего-либо еще...
Подключаем:
Инстаграм:https://www.instagram.com/gvardikos/
Линкедин:https://www.linkedin.com/in/george-vardikos-b0b199b0/
Электронная почта: [email protected]

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































