Progettare un framework applicativo che consentirà a ciascuna implementazione di personalizzare parti dell'interfaccia utente


9

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?


L'approccio 1 offre la massima flessibilità, l'approccio 2 il minimo ma richiede il minimo sforzo da parte degli utenti. Quindi, che cosa vuoi?
Trilarion,

@Trilarion onestamente spero in esperienze senior. La mia più grande preoccupazione è non essere in grado di anticipare esattamente quanto controllo devo fornire per quanto riguarda la personalizzazione
Daniel G,

4
Non è possibile prevedere la personalizzazione. È difficile definire quadri di uso generale. Nella migliore delle ipotesi è possibile fornire un codice comune che non limita in alcun modo gli altri sviluppatori. Eviterei soluzioni che richiedono ereditarietà e mi concentrerei su componenti che possono essere estesi in altri modi. Mantieni il tuo contributo il più semplice possibile.
Frank Hileman,

Risposte:


1

Questa è una domanda vecchia ma degna a cui non è mai stata data una risposta degna, alla quale, in base alla mia esperienza, ho risposto

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

è- non farlo.

Vincolare le scelte che un cliente può fare nella personalizzazione, sia nell'interfaccia utente che in qualcos'altro, è quasi sempre meglio per il venditore, perché semplifica la soluzione e riduce l'onere del supporto, e anche per il cliente, perché in questo modo sono più in grado di sfruttare l'esperienza del fornitore per arrivare al punto debole dello spazio della soluzione, senza perdere il proprio tempo reinventando la ruota.

Se hanno bisogno di una soluzione diversa, te lo diranno. Se insistono sulla personalizzazione, hanno bisogno di una soluzione diversa e semplicemente non lo sanno ancora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.