รูปแบบผู้ประสานงานใน iOS
สวัสดีเพื่อน!
ผู้ประสานงานคืออะไร?
ผู้ประสานงานเป็นส่วนประกอบของระบบที่เก็บตรรกะการนำทางของแอปพลิเคชัน รูปแบบ นี้ได้รับการแนะนำโดย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)
}
}
- องค์ประกอบ UI ที่จะฝัง ViewControllers
- ใส่องค์ประกอบ UI ในตัวสร้าง
- วิธีการเริ่มต้นคือจุดเริ่มต้นของ 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]





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)