Ho il compito di progettare un framework applicativo che consenta a ciascuna implementazione di personalizzare parti dell'interfaccia utente. Uno di questi esempi sarebbe che l'implementazione (chiamiamola client d'ora in poi) possa definire le celle della vista di raccolta da restituire per una schermata specifica. Il framework è semplicemente responsabile della distribuzione degli oggetti appropriati per rendere la creazione di un'app molto più semplice poiché creeremo diverse istanze simili.
Il mio attuale approccio al framework è stato quello di progettare un Controller di Coordinamento che sia responsabile di tutti gli eventi di presentazione e licenziamento in tutta l'App. Il controller di coordinamento predefinito distribuisce tutti i controller di visualizzazione predefiniti all'interno del framework che eseguono tutte le attività pertinenti senza fornire necessariamente un'interfaccia utente configurata. Ad esempio: un controller mostrerà una vista di raccolta con celle modello e niente di speciale. Il vantaggio di questo design è che rimuove l'accoppiamento tra i controller e consente inoltre a un client di ignorare il coordinatore predefinito e restituire un controller di visualizzazione completamente nuovo per un'attività specifica.
Il problema che sto avendo è come dovrei progettare questo framework per consentire a un client di aggiungere la propria interfaccia utente personalizzata nell'app.
Approccio 1
Fai in modo che il framework richieda una view factory e lasci che questa view factory sia responsabile della distribuzione di tutte le viste pertinenti. Pertanto, nel Delegato app potremmo fare in modo che il client crei una CollectionViewCellFactory per esempio e l'interfaccia definisca tutte le celle che qualsiasi classe conforme dovrà fornire. Ho ereditato una base di codice con questo design e me ne sono allontanato perché era troppo astratto e personalizzabile. È arrivato con tonnellate di fabbriche per ogni aspetto dell'App e questi giorni aggiunti al tempo di installazione di ogni App.
Approccio due
Ogni controller di visualizzazione specifica hook di sottoclassi o API di configurazione che consentiranno la definizione di queste classi di UI personalizzate in fase di runtime (in modo simile a come UISplitViewController consente ai chiamanti di configurare i controller utilizzando la proprietà viewControllers). Per fare ciò, ciascun cliente si limiterà a sottoclasse il controllore di base di base e in ogni presentazione dei controllori; imposta i valori appropriati sul controller in modo che raggiunga l'interfaccia utente desiderata. Qualcosa come
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
Al momento, separo l'origine dati per una vista in un oggetto separato per promuovere la riusabilità e prevenire il gonfiore di ViewController. Questo rende la sottoclasse del controller di visualizzazione per fornire l'interfaccia delle celle un po 'più difficile ma non impossibile.
Approccio 3
Forse è una cattiva idea tentare di progettare un framework e anticiparne l'utilizzo. Forse l'opzione migliore è quella di consentire la sottoclasse con il massimo controllo, anche se il costo di installazione è relativamente alto. Quindi, dopo averlo creato per diversi client, potrei notare i pattern che emergono e iniziare l'ottimizzazione lungo il percorso.
Capisco come renderlo personalizzabile all'interno del framework, quello con cui sto combattendo è come definire al meglio un'interfaccia che definisca i potenziali punti di personalizzazione del framework da parte del client.
TL; DR
La parte più complicata dell'interfaccia riguarda una vista raccolta nidificata all'interno di celle vista collezione. Ciò consente il paging orizzontale e lo scorrimento verticale delle celle. Ciò si ottiene avendo una sorgente dati che gestisce le celle orizzontali e configura la vista raccolta di ogni cella con una nuova sorgente di dati.
Come si progetta un'interfaccia che consente a tutte queste celle di essere personalizzabili?