รูปแบบผู้ประสานงานใน iOS

Feb 26 2023
สวัสดีเพื่อน! ผู้ประสานงานคืออะไร? ผู้ประสานงานเป็นส่วนประกอบของระบบที่เก็บตรรกะการนำทางของแอปพลิเคชัน รูปแบบนี้ได้รับการแนะนำโดย Sorosh Khanlou

สวัสดีเพื่อน!

ผู้ประสานงานคืออะไร?

ผู้ประสานงานเป็นส่วนประกอบของระบบที่เก็บตรรกะการนำทางของแอปพลิเคชัน รูปแบบ นี้ได้รับการแนะนำโดย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)
    }
}

  1. องค์ประกอบ UI ที่จะฝัง ViewControllers
  2. ใส่องค์ประกอบ UI ในตัวสร้าง
  3. วิธีการเริ่มต้นคือจุดเริ่มต้นของ 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 เป็นส่วนประกอบ UI หลักของแอป เราควรสร้างผู้ประสานงานสำหรับแต่ละแท็บ ดูตัวอย่างด้านล่าง:

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]