Her uygulamanın kullanıcı arabiriminin bölümlerini özelleştirmesine izin verecek bir uygulama çerçevesi tasarlamakla görevlendirildim. Böyle bir örnek, uygulamanın (şu andan itibaren istemci olarak adlandırılacağı) belirli bir ekran için geri dönmek üzere koleksiyon görünümü hücrelerini tanımlayabilmesidir. Çerçeve, benzer uygulama örnekleri oluşturacağımızdan, bir Uygulama oluşturmayı çok daha kolay hale getirmek için uygun nesneleri satın almaktan sorumludur.
Çerçeveye şu anki yaklaşımım, Uygulamadaki tüm sunum ve işten çıkarma olaylarından sorumlu bir Koordinasyon Kontrolörü tasarlamaktı. Varsayılan Koordinasyon Denetleyicisi, yapılandırılmış kullanıcı arabirimi sağlamadan ilgili görevlerini yerine getiren tüm varsayılan görünüm denetleyicilerini çerçeve içinde dağıtır. Örneğin: bir denetleyici, şablon hücreleri olan bir koleksiyon görünümü gösterir ve özel bir şey göstermez. Bu tasarımın yararı, denetleyiciler arasındaki bağlantıyı kaldırması ve ayrıca bir istemcinin varsayılan koordinatörü geçersiz kılmasına ve belirli bir görev için tamamen yeni bir görünüm denetleyicisi döndürmesine izin vermesidir.
Yaşadığım sorun, istemcinin Uygulamaya kendi özel kullanıcı arayüzünü eklemesine izin vermek için bu çerçeveyi nasıl tasarlamalıyım.
Birinci Yaklaşım
Çerçevenin bir görünüm fabrikası gerektirmesini sağlayın ve bu görünüm fabrikasının ilgili tüm görüşlerin alınmasından sorumlu olmasına izin verin. Bu nedenle, Uygulama Temsilcisi'nde istemcinin örneğin bir CollectionViewCellFactory oluşturmasını zorunlu kılabilir ve arabirim herhangi bir uygun sınıfın sağlaması gereken tüm hücreleri tanımlar. Bu tasarımla bir kod tabanı miras aldım ve çok soyut ve özelleştirilebilir olduğu için ondan uzaklaştım. Uygulamanın her yönü için tonlarca fabrika ile geldi ve bu, her Uygulamanın kurulum süresine günler ekledi.
Yaklaşım İki
Her görünüm denetleyicisi, bu özel UI sınıflarının çalışma zamanında tanımlanmasına izin verecek alt sınıf kancalarını veya kurulum API'sini belirtir (UISplitViewController, arayanların viewControllers özelliğini kullanarak denetleyicileri ayarlamasına izin verir). Bunu yapmak için, her müşteri temel Koordinasyon Kontrolörünü ve her kontrolör sunumunda alt sınıfları basitçe sınıflandıracaktır; istenen değerleri kullanıcı arayüzüne ulaşacak şekilde kontrol cihazına ayarlayın. Gibi bir şey
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
Şu anda, bir görünüm için veri kaynağını yeniden kullanılabilirliği teşvik etmek ve ViewController şişkinliğini önlemek için ayrı bir nesneye ayırıyorum. Bu, hücrelerin arayüzünü biraz daha zor ama imkansız olmayan şekilde sağlamak için görünüm kontrolörünün alt sınıflandırılmasını sağlar.
Yaklaşım 3
Bir çerçeve tasarlamaya ve kullanımını öngörmeye çalışmak belki de kötü bir fikirdir. Belki de en iyi seçenek, kurulum maliyeti nispeten yüksek olsa bile, maksimum kontrollü alt sınıflamaya izin vermektir. Sonra, birkaç müşteri için inşa ettikten sonra, ortaya çıkan ve rota boyunca optimizasyona başlayan kalıpları fark edebilirim.
Çerçevenin içinde nasıl özelleştirilebilir hale getirebileceğimi anlıyorum, mücadele ettiğim şey, müşterinin çerçevenin potansiyel özelleştirme noktalarını tanımlayan bir arabirimin en iyi nasıl tanımlanacağı.
TL; DR
Arayüzün en karmaşık kısmı, Koleksiyon Görünümü Hücrelerinin içine yerleştirilmiş bir Koleksiyon Görünümü ile ilgilidir. Bu, hücrelerin yatay sayfalanmasını ve dikey kaydırılmasını sağlar. Bu, yatay hücreleri yöneten ve her hücrenin koleksiyon görünümünü yeni bir veri kaynağıyla yapılandıran bir veri kaynağına sahip olarak gerçekleştirilir.
Tüm bu hücrelerin özelleştirilebilir olmasını sağlayan bir arayüz nasıl tasarlanır?