ออกแบบสำหรับกรอบแอปพลิเคชันที่จะช่วยให้แต่ละการใช้งานสามารถปรับแต่งส่วนต่างๆของ UI


9

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

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

เราจะออกแบบส่วนต่อประสานที่อนุญาตให้เซลล์ทั้งหมดเหล่านี้สามารถปรับแต่งได้อย่างไร


วิธีที่ 1 ให้ความยืดหยุ่นมากที่สุดเข้าใกล้ 2 อย่างน้อยที่สุด แต่ต้องการความพยายามน้อยที่สุดจากผู้ใช้ของคุณ แล้วคุณต้องการอะไร
Trilarion

@Trilarion สุจริตฉันหวังว่าจะได้รับประสบการณ์ระดับสูง ความกังวลที่ใหญ่ที่สุดของฉันคือการไม่สามารถคาดการณ์ได้อย่างแม่นยำว่าฉันต้องควบคุมเรื่องการปรับแต่งอย่างไร
Daniel G

4
คุณไม่สามารถทำนายการกำหนดเองได้ การกำหนดกรอบวัตถุประสงค์ทั่วไปเป็นเรื่องยาก ที่ดีที่สุดคุณสามารถให้รหัสทั่วไปที่ไม่ จำกัด นักพัฒนาอื่น ๆ ในทางใดทางหนึ่ง ฉันจะหลีกเลี่ยงการแก้ปัญหาที่ต้องมีการสืบทอดและให้ความสำคัญกับส่วนประกอบที่สามารถขยายได้ในวิธีอื่น รักษาผลงานของคุณให้ง่ายที่สุดเท่าที่จะทำได้
Frank Hileman

คำตอบ:


1

นี่เป็นคำถามเก่า แต่มีค่าที่ไม่เคยได้รับคำตอบที่สมควรซึ่งจากประสบการณ์ของฉันในการตอบสนอง

How would one design an interface that allows all these cells to be customizable?

ไม่ทำ

การกำหนดตัวเลือกที่ลูกค้าสามารถทำได้ในการปรับแต่ง - ไม่ว่าจะใน UI หรืออย่างอื่น - จะดีกว่าสำหรับผู้ขาย - เพราะมันทำให้การแก้ปัญหาง่ายขึ้นและลดภาระการสนับสนุน - และสำหรับลูกค้า - เพราะจากนั้นพวกเขาสามารถ ยกระดับความเชี่ยวชาญของผู้ขายเพื่อเข้าถึงจุดแก้ปัญหาโดยไม่ต้องเสียเวลาในการปรับแต่งล้อ

หากพวกเขาต้องการโซลูชันที่แตกต่างพวกเขาจะบอกคุณ หากพวกเขายืนยันในการปรับแต่งพวกเขาต้องการโซลูชันที่แตกต่างและเพียงแค่ยังไม่รู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.