เป็นหนึ่งในรูปแบบการออกแบบที่ได้รับความนิยมมากที่สุดในการเขียนโปรแกรมที่รวดเร็วเพื่อจัดการกับโฟลว์ของแอป

จะช่วยแก้ปัญหาการเขียนโปรแกรมด้านล่างใน iOS

  • การนำทางระหว่างตัวควบคุมมุมมองหลายตัว
  • การถ่ายโอนข้อมูลระหว่างตัวควบคุมมุมมองหลายตัว
  • นอกจากนี้ยังเป็นไปตามรูปแบบทึบ
  • มันจะลบโฟลว์ของหน้าจอที่เข้ารหัสอย่างหนัก
  • รับผิดชอบในการกดและป๊อปหน้าจอ
  • แก้ปัญหาการเชื่อมต่อที่แน่นหนาระหว่างตัวควบคุมมุมมอง

มาดูโค้ดว่ามันถูกสร้างขึ้นอย่างไร

  • ขั้นแรกเราจะสร้างโปรโตคอลผู้ประสานงาน
  • chidCoordinator:ที่นี่ childCoordinator จะช่วยซ้อนตัวควบคุมมุมมองทั้งหมด
  • ตัวควบคุมการนำทาง: ตัวควบคุมการนำทางจะทำหน้าที่เป็นการนำทางเริ่มต้นของแอป
  • start(): ฟังก์ชั่นเริ่มต้นจะดำเนินการเพื่อเพิ่มหน้าจอแรกให้กับหน้าต่าง
import Foundation
import UIKit

protocol Coordinator {
    var chidCoordinator: [Coordinator] { get set }
    var navigationController: UINavigationController { get set }
    func start()
}

ลองใช้โปรโตคอลผู้ประสานงาน นี่คือรหัส

import Foundation
import UIKit

class MainCoordinator: Coordinator {
    var navigationController: UINavigationController
    var chidCoordinator = [Coordinator]()
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    func start() {
        let viewController = ViewController.instantiate()
        viewController.mainCoordinator = self
        navigationController.pushViewController(viewController, animated: false)
    }
}

เราจะเพิ่มหน้าจอแรกไปที่หน้าต่าง

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let navigationController = UINavigationController()
        mainCoordinator = MainCoordinator(navigationController: navigationController)
        mainCoordinator?.start()
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = navigationController
        window?.makeKeyAndVisible()
        return true
}

นอกจากนี้เรายังจะสร้าง StoryboardProtocol เพื่อเริ่มต้น viewcontroller ทั้งหมดโดยทางโปรแกรม เราจะใช้รหัสนี้ซ้ำ

import Foundation
import UIKit

protocol StoryboardProtocol {
    static func instantiate() -> Self
}

extension StoryboardProtocol where Self: UIViewController {
    static func instantiate() -> Self {
        let viewControllerId = String(describing: self)        
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        return storyboard.instantiateViewController(withIdentifier: viewControllerId) as! Self
    }
}

ViewController ตัวแรกจะมีลักษณะเช่นนี้ เราจะเพิ่มปุ่มอีก 2 ปุ่มเพื่อดูเพื่อให้เราสามารถกดไปที่ ViewContoller A และ ViewContoller b

import UIKit

class ViewController: UIViewController, StoryboardProtocol {
    weak var mainCoordinator: MainCoordinator?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    @IBAction func tapOnButtonA(_ sender: Any) {
        mainCoordinator?.goToViewControllerA()
    }
    @IBAction func tapOnButtonB(_ sender: Any) {
        mainCoordinator?.goToViewControllerB()        
    }
}

ฉันได้เพิ่มฟังก์ชัน goToViewControllerA() และ goToViewControllerB() อีก 2 รายการเพื่อย้ายไปยังตัวควบคุมมุมมองอื่น

import Foundation
import UIKit

class MainCoordinator: Coordinator {
    var navigationController: UINavigationController
    var chidCoordinator = [Coordinator]()
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    func start() {
        let viewController = ViewController.instantiate()
        viewController.mainCoordinator = self
        navigationController.pushViewController(viewController, animated: false)
    }
    func goToViewControllerA () {
        let viewController = ViewControllerA.instantiate()
        viewController.mainCoordinator = self
        navigationController.pushViewController(viewController, animated: true)
    }
    func goToViewControllerB () {
        let viewController = ViewControllerB.instantiate()
        viewController.mainCoordinator = self
        navigationController.pushViewController(viewController, animated: true)
    }
}

รหัสสำหรับ ViewController A รหัสที่คล้ายกันคือ ViewController B

import Foundation
import UIKit

class ViewControllerA: UIViewController, StoryboardProtocol {
    weak var mainCoordinator: MainCoordinator?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "View Controller A"
    }
}

เราจะลบอินเทอร์เฟซหลัก หลัก ที่นี่ในเป้าหมาย ดังนั้นเราจึงสามารถสร้าง viewController ใด ๆ เป็นหน้าจอแรกได้ ดังนั้นจึงมีความยืดหยุ่นมากขึ้นในการเลือกว่าหน้าจอใดจะเป็นหน้าจอแรก

สตอรี่บอร์ดของเราจะหน้าตาประมาณนี้

บทช่วยสอนนี้แสดงการตั้งค่าเริ่มต้นสำหรับรูปแบบผู้ประสานงาน ฉันใช้ MainCoordinator เพียง 1 ตัวที่นี่ คุณสามารถใช้ผู้ประสานงานที่แตกต่างกันสำหรับตัวควบคุมมุมมองแต่ละตัว ฉันหวังว่าคุณจะชอบการกวดวิชา รู้สึกอิสระที่จะเพิ่มความคิดเห็น

กรุณาชอบและสมัครสมาชิก ขอบคุณ