Pola Koordinator di iOS

Feb 26 2023
Halo teman-teman! Apa itu koordinator? Koordinator adalah komponen sistem yang memegang logika navigasi aplikasi. Pola tersebut diperkenalkan oleh Soroush Khanlou.

Halo teman-teman!

Apa itu koordinator?

Koordinator adalah komponen sistem yang memegang logika navigasi aplikasi. Pola tersebut diperkenalkan oleh Soroush Khanlou .

Mengapa kita membutuhkan seorang koordinator?

Manfaat menggunakan pola koordinator adalah kita menghilangkan tanggung jawab navigasi dari pengontrol. Dengan cara ini kami dapat meningkatkan kegunaannya kembali juga kami dapat memiliki navigasi aplikasi di tempat terpusat, baik kami memiliki satu koordinator atau kami memiliki koordinator utama dengan anak-anak.

Memisahkan pengontrol tampilan dari navigasi aplikasi dapat meningkatkan keterbacaan proyek. Di aplikasi yang lebih besar, memiliki navigasi aplikasi di komponen sistem yang terpisah sangat penting, terutama jika ada tim fitur.

Tujuannya agar dapat mengubah navigasi logika dengan mudah tergantung situasi. Misalnya, pengguna yang berbeda dapat memiliki aliran yang berbeda atau pengguna iPad atau Pengujian A/B secara terpisah.

Ciri-ciri utama seorang Koordinator.

  • Satu koordinator dapat memiliki banyak ViewController.
  • Koordinator memiliki metode mulai di mana mereka menampilkan ViewController pada awalnya.
  • ViewControllers memiliki referensi ke Koordinator.
  • Koordinator memiliki susunan koordinator anak.
  • Koordinator anak memiliki referensi ke orang tua mereka.

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. Elemen UI tempat ViewController akan disematkan.
  2. Memasukkan elemen UI ke dalam konstruktor.
  3. Metode start adalah tempat inisialisasi ViewController dan koneksi dengan navigationController terjadi.

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

Koordinator dengan UITabBarController

Untuk memanfaatkan pola koordinator saat kita memiliki UITabBarController sebagai komponen UI utama aplikasi, kita harus membuat koordinator untuk setiap tab. Lihat contoh di bawah ini:

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

Memisahkan logika navigasi dari ViewControllers meningkatkan kohesi kelas dan mengurangi pemasangan sistem. Menyimpan logika navigasi di tempat sentral dan meningkatkan kemampuan penggunaan kembali dan pengujian.

Untuk kritik dan saran atau apapun...

Mari terhubung:

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

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

Email: [email protected]