ฉันได้รับมอบหมายให้ออกแบบเฟรมเวิร์กแอปพลิเคชันที่จะอนุญาตให้แต่ละการปรับใช้ส่วนต่าง ๆ ของส่วนติดต่อผู้ใช้เอง ตัวอย่างหนึ่งดังกล่าวอาจเป็นไปได้ว่าการใช้งาน (ลองเรียกว่าไคลเอนต์นับจากนี้เป็นต้นไป) สามารถกำหนดเซลล์มุมมองคอลเลกชันที่จะกลับมาสำหรับหน้าจอเฉพาะ เฟรมเวิร์กมีหน้าที่รับผิดชอบในการจำหน่ายวัตถุที่เหมาะสมเพื่อให้การสร้างแอปง่ายขึ้นมากเนื่องจากเราจะสร้างอินสแตนซ์ที่ดูคล้ายกันหลายครั้ง
แนวทางปัจจุบันของฉันในกรอบการทำงานคือการออกแบบตัวควบคุมประสานงานที่รับผิดชอบการนำเสนอและเลิกจ้างกิจกรรมทั้งหมดในแอพ ตัวควบคุมการประสานงานเริ่มต้นจะแสดงตัวควบคุมมุมมองเริ่มต้นทั้งหมดภายในกรอบงานที่ทำงานทั้งหมดที่เกี่ยวข้องโดยไม่จำเป็นต้องมี UI ที่กำหนดค่าไว้ ตัวอย่างเช่น: หนึ่งคอนโทรลเลอร์จะแสดงมุมมองคอลเลกชันที่มีเซลล์แม่แบบและไม่มีอะไรพิเศษ ประโยชน์ของการออกแบบนี้คือการลบการเชื่อมต่อระหว่างตัวควบคุมและยังช่วยให้ลูกค้าสามารถแทนที่ผู้ประสานงานเริ่มต้นและส่งกลับตัวควบคุมมุมมองใหม่ทั้งหมดสำหรับงานเฉพาะ
ปัญหาที่ฉันมีคือฉันควรออกแบบกรอบงานนี้อย่างไรเพื่อให้ลูกค้าสามารถเพิ่ม UI ที่กำหนดเองของตัวเองลงในแอพได้
แนวทางที่หนึ่ง
ทำให้เฟรมเวิร์กจำเป็นต้องใช้มุมมองจากโรงงานและให้มุมมองนี้จากโรงงานรับผิดชอบในการจำหน่ายมุมมองที่เกี่ยวข้องทั้งหมด ดังนั้นใน App Delegate เราอาจบังคับให้ไคลเอนต์สร้าง CollectionViewCellFactory เป็นต้นและอินเทอร์เฟซจะกำหนดเซลล์ทั้งหมดที่คลาสที่สอดคล้องกันใด ๆ จะต้องจัดหา ฉันสืบทอดฐานรหัสด้วยการออกแบบนี้และย้ายออกไปจากที่นี่เพราะมันเป็นนามธรรมและปรับแต่งได้ มันมาพร้อมกับโรงงานมากมายสำหรับทุกแง่มุมของแอพและจะเพิ่มวันเข้าสู่เวลาตั้งค่าของแอพทุกตัว
แนวทางที่สอง
แต่ละตัวควบคุมมุมมองระบุ hooks subclassing หรือ setup API ที่จะอนุญาตให้กำหนด UI คลาสแบบกำหนดเองเหล่านี้ในเวลาทำงาน (คล้ายกับวิธีที่ UISplitViewController อนุญาตให้ผู้เรียกตั้งค่าตัวควบคุมโดยใช้คุณสมบัติ viewControllers) ในการทำสิ่งนี้ลูกค้าแต่ละคนจะทำการ subclass Base ประสานงานควบคุมและในแต่ละงานนำเสนอของคอนโทรลเลอร์ ตั้งค่าที่เหมาะสมลงบนคอนโทรลเลอร์เพื่อให้ได้ UI ที่ต้องการ สิ่งที่ต้องการ
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
ขณะนี้ฉันแยกแหล่งข้อมูลสำหรับมุมมองเป็นวัตถุแยกต่างหากเพื่อส่งเสริมการใช้ซ้ำและป้องกันไม่ให้ ViewController ขยายตัว สิ่งนี้ทำให้ subclassing ตัวควบคุมมุมมองจัดหาอินเทอร์เฟซของเซลล์ยากขึ้นเล็กน้อย แต่เป็นไปไม่ได้
วิธีที่ 3
อาจเป็นความคิดที่ดีที่จะพยายามออกแบบกรอบงานและคาดการณ์การใช้งาน บางทีตัวเลือกที่ดีที่สุดคืออนุญาตให้ใช้คลาสย่อยที่มีการควบคุมสูงสุดแม้ว่าค่าติดตั้งจะค่อนข้างสูง จากนั้นเมื่อฉันสร้างขึ้นสำหรับลูกค้าหลายรายฉันอาจสังเกตเห็นรูปแบบที่ปรากฏและเริ่มปรับให้เหมาะสมตามเส้นทาง
ฉันเข้าใจว่าฉันจะทำให้มันปรับแต่งภายในกรอบได้อย่างไรสิ่งที่ฉันกำลังดิ้นรนคือวิธีกำหนดอินเทอร์เฟซที่ดีที่สุดที่กำหนดจุดปรับแต่งที่เป็นไปได้ของกรอบงานโดยลูกค้า
TL; DR
ส่วนที่ซับซ้อนที่สุดของอินเทอร์เฟซจะเกี่ยวข้องกับ Collection View ที่อยู่ภายใน Collection View Cells การทำเช่นนี้ช่วยให้สามารถจัดเพจจิ้งแนวนอนและเลื่อนแนวตั้งได้ สิ่งนี้ทำได้โดยการมีแหล่งข้อมูลเดียวที่จัดการเซลล์แนวนอนและกำหนดค่ามุมมองการรวบรวมของแต่ละเซลล์ด้วยแหล่งข้อมูลใหม่
เราจะออกแบบส่วนต่อประสานที่อนุญาตให้เซลล์ทั้งหมดเหล่านี้สามารถปรับแต่งได้อย่างไร