Modèle de coordinateur iOS
Dans l'article d'aujourd'hui, explorons en détail le modèle de coordinateur. Nous verrons comment configurer un coordinateur à partir de zéro et verrons les avantages de l'implémenter dans les projets iOS
Arrière-plan…….
Comme nous le savons tous, les modèles de conception iOS les plus utilisés sont MVVM et MVC (il peut parfois s'agir d'un contrôleur de vue massif ). L'un des plus gros inconvénients de ces modèles est que les contrôleurs détiennent la logique de routage. Ici, le routage peut consister à initialiser et à gérer les contrôleurs suivants dans le flux métier.
Modèle de coordinateur…….
Le modèle de coordinateur surmonte ce problème en faisant abstraction de la logique de routage. Ici tous les contrôleurs de vue qui peuvent être regroupés logiquement sous un flux métier coordonné avec le coordinateur. Le coordinateur est seul responsable du prochain contrôleur dans le flux d'affaires. Cela rend la logique de routage plus lisible, maintenable et extensible.
Coordinateur HLD….
Coordinateur en action…..
Voyons maintenant comment créer un modèle de coordinateur à partir de rien.
Protocole du coordinateur : créons une interface pour nos coordinateurs qui oblige tous les coordinateurs à s'aligner sur nos attentes.
- navController : ce serait le contrôleur de navigation pour gérer la pile du viewcontroller.
- eventOccurred(T): Ceci serait utilisé par notre viewcontroller pour mettre à jour tout événement de navigation vers le coordinateur
- start() : cette méthode unique est appelée pour démarrer le flux d'activité
protocol Coordinator {
var navController : UINavigationController? { get set }
func eventOccurred<T: RawRepresentable>(type: T) where T.RawValue == Int
func start()
}
protocol Coordinating {
var coordinator: Coordinator? { get set}
}
typealias CoordinatingVC = UIViewController & Coordinating
class ViewController: CoordinatingVC {
var coordinator: Coordinator?
override func viewDidLoad() {
super.viewDidLoad()
setUp()
setUpCTA()
}
private func setUp() {
self.view.backgroundColor = .white
self.title = "Screen1"
}
private func setUpCTA() {
let screen2CTA = UIButton()
screen2CTA.setTitle("Go to Screen2", for: .normal)
screen2CTA.backgroundColor = .gray
view.addSubview(screen2CTA)
screen2CTA.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
screen2CTA.leadingAnchor.constraint(equalTo: view.leadingAnchor,
constant: AppUIConfig.padding),
screen2CTA.trailingAnchor.constraint(equalTo: view.trailingAnchor,
constant: -AppUIConfig.padding),
screen2CTA.centerYAnchor.constraint(equalTo: view.centerYAnchor),
screen2CTA.heightAnchor.constraint(equalToConstant: AppUIConfig.buttonheight)
])
screen2CTA.addTarget(self,
action: #selector(screen2CTATapped),
for: .touchUpInside)
}
@objc func screen2CTATapped() {
coordinator?.eventOccurred(type: MainCoordinatorEvent.screen2)
}
}
enum MainCoordinatorEvent: Int {
case screen2
case screen1
}
class MainCoordinator : Coordinator {
func eventOccurred<T>(type: T) where T : RawRepresentable, T.RawValue == Int {
guard let type = type as? MainCoordinatorEvent else {
return
}
switch type {
case .screen2:
setupScreen2()
case .screen1:
setupScreen1()
}
}
var navController: UINavigationController?
func start() {
setupScreen1()
}
private func setupScreen1() {
guard var navController = navController else {
return
}
if let firstVC = navController.viewControllers.first {
navController.popToViewController(firstVC, animated: true)
return
}
var viewController: CoordinatingVC = ViewController()
viewController.coordinator = self
navController.setViewControllers([viewController], animated: false)
}
private func setupScreen2() {
var viewController: CoordinatingVC = ViewController2()
viewController.coordinator = self
navController?.pushViewController(viewController, animated: true)
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
setUpWindow()
return true
}
private func setUpWindow() {
let window = createKeyWindow()
let mainCoordinator = createMainCoordinator()
window.rootViewController = mainCoordinator.navController
window.makeKeyAndVisible()
self.window = window
mainCoordinator.start()
}
private func createMainCoordinator() -> Coordinator {
let navViewController = UINavigationController()
let mainCoordinator = MainCoordinator()
mainCoordinator.navController = navViewController
return mainCoordinator
}
private func createKeyWindow() -> UIWindow {
let window = UIWindow(frame: UIScreen.main.bounds)
return window
}
Maintenant que nous savons comment gérer un flux d'affaires en utilisant le modèle de coordinateur. Nous pouvons étendre le modèle de manière récursive pour gérer un groupe de coordinateurs simplifiant ainsi chaque flux d'utilisateurs regroupés logiquement à gérer par lui-même.
Suivre le modèle de coordinateur dans les applications iOS rend le routage entre les flux d'utilisateurs plus propre et plus robuste. Cela rend chaque contrôleur de vue vraiment isolé et facile à entretenir.
Les références :
https://www.hackingwithswift.com/articles/71/how-to-use-the-coordinator-pattern-in-ios-apps
https://www.youtube.com/watch?v=SAZzcKvOvAE
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































