Saya bertugas merancang kerangka kerja aplikasi yang akan memungkinkan setiap implementasi untuk menyesuaikan bagian-bagian antarmuka pengguna. Salah satu contohnya adalah implementasinya (sebut saja klien mulai sekarang) dapat mendefinisikan sel tampilan koleksi untuk dikembalikan ke layar tertentu. Kerangka kerja ini hanya bertanggung jawab untuk menjual benda-benda yang tepat untuk membuat membangun Aplikasi lebih mudah karena kita akan membangun beberapa contoh yang mirip.
Pendekatan saya saat ini terhadap kerangka kerja ini adalah merancang Pengendali Koordinasi yang bertanggung jawab untuk semua acara presentasi dan pemberhentian di seluruh Aplikasi. Pengendali Koordinasi default mengeluarkan semua pengontrol tampilan default di dalam kerangka kerja yang semuanya melakukan tugas yang relevan tanpa harus menyediakan UI yang dikonfigurasi. Sebagai contoh: satu controller akan menampilkan tampilan koleksi dengan sel-sel template dan tidak ada yang istimewa. Manfaat dari desain ini adalah menghilangkan kopling antara pengontrol dan juga memungkinkan klien untuk mengesampingkan koordinator default dan mengembalikan pengontrol tampilan yang sama sekali baru untuk tugas tertentu.
Masalah yang saya alami adalah bagaimana saya harus merancang kerangka kerja ini untuk memungkinkan klien menambahkan UI kustom mereka sendiri ke dalam Aplikasi.
Pendekatan Satu
Membuat kerangka kerja memerlukan pabrik tampilan dan biarkan pabrik tampilan ini bertanggung jawab untuk mengeluarkan semua tampilan yang relevan. Dengan demikian, dalam App Delegate kita dapat memastikan bahwa klien membuat CollectionViewCellFactory misalnya dan antarmuka mendefinisikan semua sel yang diperlukan oleh setiap kelas yang sesuai untuk memasok. Saya mewarisi basis kode dengan desain ini dan menjauh darinya karena terlalu abstrak dan dapat disesuaikan. Itu datang dengan banyak pabrik untuk setiap aspek App dan ini menambahkan hari ke waktu pengaturan setiap App.
Pendekatan Dua
Setiap pengontrol tampilan menentukan kait subkelas atau API pengaturan yang akan memungkinkan untuk kelas UI khusus ini untuk didefinisikan pada waktu berjalan (Mirip dengan bagaimana UISplitViewController memungkinkan penelepon mengatur pengontrol menggunakan properti viewControllers). Untuk melakukan ini, setiap klien hanya akan subkelas Pengendali Koordinasi dasar dan dalam setiap presentasi pengontrol; atur nilai yang sesuai ke controller sehingga mencapai UI yang diinginkan. Sesuatu seperti
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
Saat ini, saya memisahkan sumber data untuk dilihat menjadi objek terpisah untuk mempromosikan penggunaan kembali dan mencegah mengasapi ViewController. Ini membuat subkelas pengontrol tampilan untuk memasok antarmuka sel sedikit lebih sulit tetapi tidak mustahil.
Pendekatan 3
Mungkin ide yang buruk untuk mencoba merancang kerangka kerja dan mengantisipasi penggunaannya. Mungkin opsi terbaik adalah untuk memungkinkan subkelas dengan kontrol maksimum, bahkan jika biaya setup relatif tinggi. Kemudian, setelah saya membangunnya untuk beberapa klien, saya mungkin memperhatikan pola yang muncul dan mulai optimisasi di sepanjang rute.
Saya mengerti bagaimana saya bisa membuatnya dapat disesuaikan secara internal ke dalam kerangka kerja, yang saya perjuangkan adalah bagaimana cara terbaik mendefinisikan antarmuka yang mendefinisikan titik-titik kustomisasi potensial dari kerangka kerja oleh klien.
TL; DR
Bagian paling rumit dari antarmuka berkaitan dengan Collection View yang bersarang di dalam Collection View Cells. Ini memungkinkan paging horizontal dan pengguliran vertikal sel. Ini dicapai dengan memiliki satu sumber data yang mengelola sel horizontal dan mengonfigurasi tampilan koleksi setiap sel dengan sumber data baru.
Bagaimana seseorang mendesain antarmuka yang memungkinkan semua sel ini dapat dikustomisasi?