Ho il compito di progettare un framework applicativo che consenta ad ogni implementazione di personalizzare parti dell'interfaccia utente. Un esempio potrebbe essere che l'implementazione (chiamiamola client da ora in poi) può definire le celle della vista di raccolta da restituire per una determinata schermata. Il framework è semplicemente responsabile della vendita degli oggetti appropriati per rendere la creazione di un'app molto più semplice poiché costruiremo diverse istanze simili.
Il mio attuale approccio al framework è stato quello di progettare un coordinatore responsabile di tutti gli eventi di presentazione e licenziamento in tutta l'App. Il Coordination Controller predefinito distribuisce tutti i controller di visualizzazione predefiniti all'interno del framework che svolgono tutti i loro compiti rilevanti senza necessariamente fornire l'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 anche a un client di ignorare il coordinatore predefinito e restituire un controller di visualizzazione completamente nuovo per un'attività specifica.
Il problema che sto riscontrando è come dovrei progettare questo framework per consentire a un client di aggiungere la propria interfaccia utente personalizzata nell'app.
Approccio Uno
Fare in modo che il framework richieda una view factory e lasciare che questa view factory sia responsabile della distribuzione di tutte le view rilevanti. Pertanto, nel delegato app potremmo imporre che il client crei 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 mi sono allontanato da esso perché era troppo astratto e personalizzabile. È arrivato con tonnellate di fabbriche per ogni aspetto dell'app e questo ha aggiunto giorni ai tempi di installazione di ogni app.
Approccio due
Ogni controller di visualizzazione specifica hook di sottoclasse o API di installazione che consentiranno di definire queste classi personalizzate dell'interfaccia utente in fase di esecuzione (analogamente a come UISplitViewController consente ai chiamanti di configurare i controller utilizzando la proprietà viewControllers). Per fare ciò, ogni cliente dovrà semplicemente sottoclassare il Controller di coordinamento di base e nella presentazione di ciascun controller; impostare i valori appropriati sul controller in modo che raggiunga l'interfaccia utente desiderata. Qualcosa di simile a
viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
//perform custom registration
}
viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
//dequeue custom cells
}
Attualmente, separo l'origine dati per una vista in un oggetto separato per promuovere la riusabilità e prevenire il gonfiamento di ViewController. Ciò 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 è consentire la sottoclasse con il massimo controllo, anche se il costo di installazione è relativamente elevato. Quindi, una volta creato per diversi client, potrei notare gli schemi che emergono e iniziare l'ottimizzazione lungo il percorso.
Capisco come potrei renderlo personalizzabile interno al framework, quello con cui sto lottando è come definire al meglio un'interfaccia che definisce 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 delle celle Vista raccolta. Ciò consente il paging orizzontale e lo scorrimento verticale delle celle. Ciò si ottiene avendo un'unica origine dati che gestisce le celle orizzontali e configura la vista di raccolta di ciascuna cella con una nuova origine dati.
Come si potrebbe progettare un'interfaccia che consenta di personalizzare tutte queste celle?