Koordinatormuster in iOS
Hallo Leute!
Was ist ein Koordinator?
Der Koordinator ist eine Systemkomponente, die die Navigationslogik einer Anwendung enthält. Das Muster wurde von Soroush Khanlou eingeführt .
Warum brauchen wir einen Koordinator?
Der Vorteil der Verwendung des Koordinatormusters besteht darin, dass wir den Controllern die Verantwortung für die Navigation entziehen. Auf diese Weise können wir ihre Wiederverwendbarkeit erhöhen und die Navigation der App an einem zentralen Ort haben, entweder wir haben einen Koordinator oder wir haben einen Hauptkoordinator mit Kindern.
Durch die Entkopplung der Ansichtscontroller von der App-Navigation kann die Lesbarkeit des Projekts verbessert werden. Bei größeren Apps ist es wichtig, die Navigation der App in einer separaten Komponente des Systems zu haben, insbesondere wenn Feature-Teams vorhanden sind.
Ziel ist es, die Navigation der Logik je nach Situation einfach ändern zu können. Beispielsweise können unterschiedliche Benutzer unterschiedliche Abläufe oder iPad-Benutzer oder isolierte A/B-Tests haben.
Hauptmerkmale eines Koordinators.
- Ein Koordinator kann viele ViewController haben.
- Koordinatoren verfügen über eine Startmethode, mit der sie den ViewController zunächst anzeigen.
- ViewController haben einen Verweis auf einen Koordinator.
- Der Koordinator verfügt über eine Reihe von untergeordneten Koordinatoren.
- Untergeordnete Koordinatoren haben einen Verweis auf ihre Eltern.
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)
}
}
- Das UI-Element, in das die ViewController eingebettet werden.
- Das UI-Element wurde in den Konstruktor eingefügt.
- In der Startmethode erfolgt die Initialisierung des ViewControllers und die Verbindung mit dem 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
// ...
}
Koordinatoren mit UITabBarController
Um vom Koordinatormuster zu profitieren, wenn wir einen UITabBarController als Haupt-UI-Komponente der App haben, sollten wir für jede Registerkarte einen Koordinator erstellen. Sehen Sie sich das folgende Beispiel an:
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
}
}
Die Trennung der Navigationslogik von ViewControllern erhöht den Klassenzusammenhalt und verringert die Kopplung des Systems. Hält die Navigationslogik an einem zentralen Ort und verbessert die Wiederverwendbarkeit und Testbarkeit.
Für Kommentare, Vorschläge oder sonstiges ...
Lassen Sie uns verbinden:
Instagram:https://www.instagram.com/gvardikos/
Linkedin:https://www.linkedin.com/in/george-vardikos-b0b199b0/
E-Mail: [email protected]

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































