iOS'ta Koordinatör Kalıbı

Feb 26 2023
Merhaba arkadaşlar! koordinatör nedir? Koordinatör, bir uygulamanın gezinme mantığını tutan bir sistem bileşenidir. Desen, Soroush Khanlou tarafından tanıtıldı.

Merhaba arkadaşlar!

koordinatör nedir?

Koordinatör, bir uygulamanın gezinme mantığını tutan bir sistem bileşenidir. Desen, Soroush Khanlou tarafından tanıtıldı .

Neden bir koordinatöre ihtiyacımız var?

Koordinatör kalıbını kullanmanın yararı, kontrolörlerden navigasyon sorumluluğunu kaldırmamızdır. Bu şekilde tekrar kullanılabilirliğini artırabiliriz, ayrıca uygulamanın navigasyonunu merkezi bir yerde tutabiliriz, ya bir koordinatörümüz var ya da çocuklarla birlikte bir ana koordinatörümüz var.

Görünüm denetleyicilerini uygulama gezintisinden ayırmak, projenin okunabilirliğini artırabilir. Daha büyük uygulamalarda, özellikle özellik ekipleri varsa, uygulamanın navigasyonunun sistemin ayrı bir bileşeninde olması çok önemlidir.

Amaç, duruma bağlı olarak mantığın navigasyonunu kolayca değiştirebilmektir. Örneğin, farklı kullanıcıların farklı akışları olabilir veya iPad kullanıcıları veya A/B Testi birbirinden bağımsız olabilir.

Bir Koordinatörün temel özellikleri.

  • Bir koordinatörün birçok ViewController'ı olabilir.
  • Koordinatörlerin, başlangıçta ViewController'ı görüntüledikleri bir başlatma yöntemi vardır.
  • ViewControllers'ın bir Koordinatöre referansı vardır.
  • Koordinatörün bir dizi alt koordinatörü vardır.
  • Çocuk koordinatörlerin ebeveynlerine bir referansı vardır.

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)
    }
}

  1. ViewControllers'ın katıştırılacağı UI öğesi.
  2. Yapıcıya UI öğesini enjekte etti.
  3. Start yöntemi, ViewController'ın başlatılmasının ve NavigationController ile bağlantının gerçekleştiği yerdir.

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 ile koordinatörler

Uygulamanın ana UI bileşeni olarak bir UITabBarController'a sahip olduğumuzda koordinatör modelinden faydalanmak için her sekme için bir koordinatör oluşturmalıyız. Aşağıdaki örneğe bakın:

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
    }
}

Navigasyon mantığını ViewControllers'tan ayırmak, sınıf uyumunu artırır ve sistemin eşlenmesini azaltır. Navigasyon mantığını merkezi bir yerde tutar ve yeniden kullanılabilirliği ve test edilebilirliği geliştirir.

Her türlü görüş, öneri veya başka bir şey için...

Bağlanalım:

Instagram:https://www.instagram.com/gvardikos/

Linkedin:https://www.linkedin.com/in/george-vardikos-b0b199b0/

E-posta: [email protected]