Conception d'un cadre d'application qui permettra à chaque implémentation de personnaliser des parties de l'interface utilisateur


9

Je suis chargé de concevoir un cadre d'application qui permettra à chaque implémentation de personnaliser des parties de l'interface utilisateur. Un tel exemple serait que l'implémentation (appelons-la désormais client) peut définir les cellules de la vue de collection à renvoyer pour un écran particulier. Le cadre est simplement responsable de la vente des objets appropriés pour faciliter la construction d'une application, car nous allons créer plusieurs instances similaires.

Mon approche actuelle du cadre a été de concevoir un contrôleur de coordination qui est responsable de tous les événements de présentation et de licenciement dans l'application. Le contrôleur de coordination par défaut distribue tous les contrôleurs de vue par défaut à l'intérieur du cadre qui effectuent tous leurs tâches pertinentes sans nécessairement fournir une interface utilisateur configurée. Par exemple: un contrôleur affichera une vue de collection avec des cellules de modèle et rien de spécial. L'avantage de cette conception est qu'elle supprime le couplage entre les contrôleurs et permet également à un client de remplacer le coordinateur par défaut et de renvoyer un contrôleur de vue entièrement nouveau pour une tâche spécifique.

Le problème que j'ai est de savoir comment concevoir ce cadre pour permettre à un client d'ajouter sa propre interface utilisateur personnalisée dans l'application.

Première approche

Faites en sorte que le framework nécessite une fabrique de vues et laissez cette fabrique de vues être chargée de distribuer toutes les vues pertinentes. Ainsi, dans le délégué d'application, nous pourrions imposer que le client crée un CollectionViewCellFactory par exemple et que l'interface définit toutes les cellules que toute classe conforme devra fournir. J'ai hérité d'une base de code avec cette conception et je m'en suis éloignée car elle était beaucoup trop abstraite et personnalisable. Il est venu avec des tonnes d'usines pour chaque aspect de l'application et cela a ajouté des jours au temps de configuration de chaque application.

Deuxième approche

Chaque contrôleur de vue spécifie des crochets de sous-classe ou une API de configuration qui permettront à ces classes d'interface utilisateur personnalisées d'être définies au moment de l'exécution (similaire à la façon dont UISplitViewController permet aux appelants de configurer les contrôleurs à l'aide de la propriété viewControllers). Pour ce faire, chaque client sous-classera simplement le contrôleur de coordination de base et dans chaque présentation de contrôleurs; définissez les valeurs appropriées sur le contrôleur afin qu'il atteigne l'interface utilisateur souhaitée. Quelque chose comme

viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
   //perform custom registration
}

viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
   //dequeue custom cells
}

Actuellement, je sépare la source de données d'une vue dans un objet distinct pour promouvoir la réutilisabilité et empêcher le ballonnement de ViewController. Cela rend le sous-classement du contrôleur de vue pour fournir l'interface des cellules un peu plus difficile mais pas impossible.

Approche 3

C'est peut-être une mauvaise idée d'essayer de concevoir un cadre et d'anticiper son utilisation. La meilleure option est peut-être de permettre un sous-classement avec un contrôle maximal, même si le coût de configuration est relativement élevé. Ensuite, une fois que je l'ai créé pour plusieurs clients, je peux remarquer les modèles qui émergent et commencer l'optimisation le long de l'itinéraire.

Je comprends comment je pourrais le rendre personnalisable en interne au framework, ce qui me pose problème, c'est comment définir au mieux une interface qui définit les points de personnalisation potentiels du framework par le client.

TL; DR

La partie la plus compliquée de l'interface concerne une vue de collection imbriquée dans les cellules de vue de collection. Cela permet la pagination horizontale et le défilement vertical des cellules. Pour ce faire, une seule source de données gère les cellules horizontales et configure la vue de collecte de chaque cellule avec une nouvelle source de données.

Comment concevoir une interface permettant à toutes ces cellules d'être personnalisables?


L'approche 1 donne le plus de flexibilité, l'approche 2 le moins mais nécessite moins d'efforts de la part de vos utilisateurs. Alors, qu'est-ce que vous voulez?
Trilarion

@Trilarion honnêtement j'espère une expérience senior. Ma plus grande préoccupation est de ne pas pouvoir prévoir exactement combien de contrôle je dois fournir concernant la personnalisation
Daniel G

4
Vous ne pouvez pas prédire la personnalisation. Il est difficile de définir des cadres à usage général. Au mieux, vous pouvez fournir du code commun qui ne limite en aucune façon les autres développeurs. J'éviterais les solutions qui nécessitent l'héritage et je me concentrerais sur les composants qui peuvent être étendus d'autres manières. Gardez votre propre contribution aussi simple que possible.
Frank Hileman

Réponses:


1

C'est une question ancienne mais digne qui n'a jamais obtenu de réponse digne, ce qui, selon mon expérience, en réponse à

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

est- ne le faites pas.

Contraindre les choix qu'un client peut faire dans la personnalisation - que ce soit dans l'interface utilisateur ou dans quelque chose d'autre - est presque toujours meilleur pour le fournisseur - car cela simplifie la solution et réduit le fardeau du support - et aussi pour le client - parce qu'alors ils sont le plus en mesure de tirer parti de l'expertise du fournisseur pour atteindre le point idéal de l'espace de la solution, sans perdre son temps à réinventer la roue.

S'ils ont besoin d'une solution différente, ils vous le diront. S'ils insistent sur la personnalisation, ils ont besoin d'une solution différente et ne la connaissent pas encore.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.