Thiết kế cho một khung ứng dụng sẽ cho phép mỗi triển khai tùy chỉnh các phần của giao diện người dùng


9

Tôi được giao nhiệm vụ thiết kế một khung ứng dụng cho phép mỗi triển khai tùy chỉnh các phần của giao diện người dùng. Một ví dụ như vậy là việc triển khai (hãy gọi nó là máy khách từ bây giờ) có thể xác định các ô xem bộ sưu tập để trả về cho một màn hình cụ thể. Khung này chịu trách nhiệm đơn giản cho việc bán các đối tượng thích hợp để giúp xây dựng Ứng dụng dễ dàng hơn nhiều vì chúng tôi sẽ xây dựng một số trường hợp tương tự.

Cách tiếp cận hiện tại của tôi đối với khung là thiết kế Bộ điều khiển phối hợp chịu trách nhiệm cho tất cả các sự kiện trình bày và sa thải trong suốt Ứng dụng. Bộ điều khiển phối hợp mặc định loại bỏ tất cả các bộ điều khiển xem mặc định bên trong khung mà tất cả thực hiện các tác vụ liên quan của chúng mà không nhất thiết phải cung cấp UI được cấu hình. Ví dụ: một bộ điều khiển sẽ hiển thị chế độ xem bộ sưu tập với các ô mẫu và không có gì đặc biệt. Lợi ích của thiết kế này là nó loại bỏ khớp nối giữa các bộ điều khiển và cũng cho phép khách hàng ghi đè lên bộ điều phối mặc định và trả về bộ điều khiển xem hoàn toàn mới cho một tác vụ cụ thể.

Vấn đề tôi gặp phải là tôi nên thiết kế khung này như thế nào để cho phép khách hàng thêm UI tùy chỉnh của riêng họ vào Ứng dụng.

Cách tiếp cận

Làm cho khung yêu cầu một nhà máy xem và để nhà máy xem này chịu trách nhiệm bán ra tất cả các quan điểm liên quan. Do đó, trong Đại biểu ứng dụng, chúng tôi có thể thực thi rằng máy khách tạo một CollectionViewCellFactory chẳng hạn và giao diện xác định tất cả các ô mà bất kỳ lớp tuân thủ nào cũng sẽ cần cung cấp. Tôi đã thừa hưởng một cơ sở mã với thiết kế này và di chuyển ra khỏi nó vì nó quá trừu tượng và có thể tùy chỉnh. Nó đi kèm với hàng tấn nhà máy cho mọi khía cạnh của Ứng dụng và điều này đã thêm ngày vào thời gian thiết lập của mỗi Ứng dụng.

Cách tiếp cận hai

Mỗi trình điều khiển khung nhìn chỉ định các móc phân lớp hoặc API thiết lập sẽ cho phép các lớp UI tùy chỉnh này được xác định trong thời gian chạy (Tương tự như cách UISplitViewContoder cho phép người gọi thiết lập bộ điều khiển bằng thuộc tính viewControllers). Để làm điều này, mỗi máy khách sẽ chỉ cần phân lớp Bộ điều khiển phối hợp cơ sở và trong mỗi phần trình bày của bộ điều khiển; đặt các giá trị phù hợp lên bộ điều khiển để nó đạt được giao diện người dùng mong muốn. Cái gì đó như

viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
   //perform custom registration
}

viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
   //dequeue custom cells
}

Hiện tại, tôi tách nguồn dữ liệu cho chế độ xem thành một đối tượng riêng biệt để thúc đẩy khả năng sử dụng lại và ngăn chặn sự phình to của ViewContoder. Điều này làm cho việc phân lớp bộ điều khiển khung nhìn để cung cấp giao diện của các ô khó hơn một chút nhưng không phải là không thể.

Cách tiếp cận 3

Có lẽ đó là một ý tưởng tồi để cố gắng thiết kế một khung và dự đoán việc sử dụng nó. Có thể tùy chọn tốt nhất là cho phép phân lớp với kiểm soát tối đa, ngay cả khi chi phí thiết lập tương đối cao. Sau đó, một khi tôi đã xây dựng nó cho một số khách hàng, tôi có thể nhận thấy các mẫu xuất hiện và bắt đầu tối ưu hóa dọc theo tuyến đường.

Tôi hiểu làm thế nào tôi có thể làm cho nó có thể tùy chỉnh nội bộ theo khung, điều tôi đang vật lộn là làm thế nào để xác định tốt nhất một giao diện xác định các điểm tùy chỉnh tiềm năng của khung theo máy khách.

TL; DR

Phần phức tạp nhất của giao diện liên quan đến Chế độ xem Bộ sưu tập được lồng bên trong Bộ sưu tập Chế độ xem. Điều này cho phép phân trang ngang và cuộn dọc của các ô. Điều này đạt được bằng cách có một nguồn dữ liệu quản lý các ô ngang và định cấu hình chế độ xem bộ sưu tập của mỗi ô với một nguồn dữ liệu mới.

Làm thế nào một người có thể thiết kế một giao diện cho phép tất cả các ô này có thể tùy chỉnh?


Cách tiếp cận 1 mang lại sự linh hoạt nhất, cách tiếp cận 2 ít nhất nhưng đòi hỏi ít nỗ lực nhất từ ​​người dùng của bạn. Vậy bạn muốn gì?
Trilarion

@Trilarion thật lòng tôi đang hy vọng có kinh nghiệm cao cấp. Mối quan tâm lớn nhất của tôi là không thể lường trước chính xác tôi cần cung cấp bao nhiêu quyền kiểm soát liên quan đến việc tùy chỉnh
Daniel G

4
Bạn không thể dự đoán các tùy chỉnh. Xác định khung mục đích chung là khó khăn. Tốt nhất bạn có thể cung cấp một số mã phổ biến không giới hạn các nhà phát triển khác theo bất kỳ cách nào. Tôi sẽ tránh các giải pháp đòi hỏi sự kế thừa và tập trung vào các thành phần có thể được mở rộng theo những cách khác. Giữ đóng góp của riêng bạn càng đơn giản càng tốt.
Frank Hileman

Câu trả lời:


1

Đây là câu hỏi cũ nhưng xứng đáng mà không bao giờ có câu trả lời xứng đáng, theo kinh nghiệm của tôi, để đáp lại

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

là - đừng làm điều đó.

Hạn chế các lựa chọn mà khách hàng có thể thực hiện trong tùy chỉnh - dù là trong UI hay ở thứ khác - hầu như luôn tốt hơn cho nhà cung cấp - bởi vì nó đơn giản hóa giải pháp và giảm gánh nặng hỗ trợ - và cho cả khách hàng - bởi vì sau đó họ có thể tận dụng chuyên môn của nhà cung cấp để đi đến điểm ngọt ngào của không gian giải pháp, mà không lãng phí thời gian của họ để phát minh lại bánh xe.

Nếu họ cần một giải pháp khác, họ sẽ nói với bạn. Nếu họ khăng khăng tùy chỉnh, họ cần một giải pháp khác và chỉ chưa biết đến nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.