เป็นหนึ่งในรูปแบบการออกแบบที่ได้รับความนิยมมากที่สุดในการเขียนโปรแกรมที่รวดเร็วเพื่อจัดการกับโฟลว์ของแอป
จะช่วยแก้ปัญหาการเขียนโปรแกรมด้านล่างใน 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 ตัวที่นี่ คุณสามารถใช้ผู้ประสานงานที่แตกต่างกันสำหรับตัวควบคุมมุมมองแต่ละตัว ฉันหวังว่าคุณจะชอบการกวดวิชา รู้สึกอิสระที่จะเพิ่มความคิดเห็น
กรุณาชอบและสมัครสมาชิก ขอบคุณ