Entwurf für ein Anwendungsframework, mit dem jede Implementierung Teile der Benutzeroberfläche anpassen kann


9

Ich habe die Aufgabe, ein Anwendungsframework zu entwerfen, mit dem jede Implementierung Teile der Benutzeroberfläche anpassen kann. Ein solches Beispiel wäre, dass die Implementierung (von nun an als Client bezeichnet) die Zellen der Sammlungsansicht definieren kann, die für einen bestimmten Bildschirm zurückgegeben werden sollen. Das Framework ist einfach dafür verantwortlich, die entsprechenden Objekte zu verkaufen, um das Erstellen einer App erheblich zu vereinfachen, da wir mehrere ähnlich aussehende Instanzen erstellen werden.

Mein aktueller Ansatz für das Framework bestand darin, einen Koordinierungscontroller zu entwerfen, der für alle Präsentations- und Entlassungsereignisse in der gesamten App verantwortlich ist. Der Standard-Koordinierungs-Controller verkauft alle Standard-Ansichts-Controller innerhalb des Frameworks, die alle ihre relevanten Aufgaben ausführen, ohne unbedingt eine konfigurierte Benutzeroberfläche bereitzustellen. Beispiel: Ein Controller zeigt eine Sammlungsansicht mit Vorlagenzellen und nichts Besonderem an. Der Vorteil dieses Entwurfs besteht darin, dass die Kopplung zwischen Controllern aufgehoben wird und ein Client den Standardkoordinator überschreiben und einen völlig neuen Ansichtscontroller für eine bestimmte Aufgabe zurückgeben kann.

Das Problem, das ich habe, ist, wie ich dieses Framework entwerfen soll, damit ein Client der App seine eigene benutzerdefinierte Benutzeroberfläche hinzufügen kann.

Ansatz Eins

Stellen Sie sicher, dass für das Framework eine View Factory erforderlich ist, und lassen Sie diese View Factory für den Verkauf aller relevanten Ansichten verantwortlich sein. Daher können wir im App-Delegaten erzwingen, dass der Client beispielsweise eine CollectionViewCellFactory erstellt und die Schnittstelle alle Zellen definiert, die eine konforme Klasse bereitstellen muss. Ich habe eine Codebasis mit diesem Design geerbt und mich davon entfernt, da es viel zu abstrakt und anpassbar war. Es gab unzählige Fabriken für jeden Aspekt der App, und dies verlängerte die Rüstzeit jeder App um Tage.

Ansatz zwei

Jeder View-Controller gibt Hooks für Unterklassen oder Setup-APIs an, mit denen diese benutzerdefinierten UI-Klassen zur Laufzeit definiert werden können (ähnlich wie UISplitViewController es Anrufern ermöglicht, die Controller mithilfe der viewControllers-Eigenschaft einzurichten). Zu diesem Zweck wird jeder Client einfach den Basiskoordinationscontroller und in jeder Controllerpräsentation unterklassifizieren. Stellen Sie die entsprechenden Werte auf dem Controller ein, damit die gewünschte Benutzeroberfläche erreicht wird. So etwas wie

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

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

Derzeit trenne ich die Datenquelle für eine Ansicht in ein separates Objekt, um die Wiederverwendbarkeit zu fördern und das Aufblähen von ViewController zu verhindern. Dies macht die Unterklassifizierung des Ansichtscontrollers zur Versorgung der Schnittstelle der Zellen etwas schwieriger, aber nicht unmöglich.

Ansatz 3

Vielleicht ist es eine schlechte Idee, zu versuchen, ein Framework zu entwerfen und dessen Verwendung vorwegzunehmen. Vielleicht ist die beste Option, eine Unterklasse mit maximaler Kontrolle zuzulassen, selbst wenn die Einrichtungskosten relativ hoch sind. Sobald ich es für mehrere Clients erstellt habe, bemerke ich möglicherweise die auftretenden Muster und beginne mit der Optimierung entlang der Route.

Ich verstehe, wie ich es innerhalb des Frameworks anpassbar machen kann. Ich habe Probleme damit, eine Schnittstelle zu definieren, die potenzielle Anpassungspunkte des Frameworks durch den Client definiert.

TL; DR

Der komplizierteste Teil der Benutzeroberfläche befasst sich mit einer Sammlungsansicht, die in Sammlungsansichtszellen verschachtelt ist. Dies ermöglicht horizontales Paging und vertikales Scrollen von Zellen. Dies wird erreicht, indem eine Datenquelle vorhanden ist, die die horizontalen Zellen verwaltet und die Erfassungsansicht jeder Zelle mit einer neuen Datenquelle konfiguriert.

Wie würde man eine Schnittstelle entwerfen, mit der alle diese Zellen anpassbar sind?


Ansatz 1 bietet die größte Flexibilität, Ansatz 2 die geringste, erfordert jedoch den geringsten Aufwand Ihrer Benutzer. Also was willst du?
Trilarion

@ Trilarion ehrlich gesagt hoffe ich auf Seniorenerfahrung. Meine größte Sorge ist, nicht genau vorhersehen zu können, wie viel Kontrolle ich in Bezug auf die Anpassung bereitstellen muss
Daniel G

4
Sie können die Anpassung nicht vorhersagen. Das Definieren von Allzweck-Frameworks ist schwierig. Bestenfalls können Sie allgemeinen Code bereitstellen, der die anderen Entwickler in keiner Weise einschränkt. Ich würde Lösungen vermeiden, die Vererbung erfordern, und mich auf Komponenten konzentrieren, die auf andere Weise erweitert werden können. Halten Sie Ihren eigenen Beitrag so einfach wie möglich.
Frank Hileman

Antworten:


1

Dies ist eine alte, aber würdige Frage, die nie eine würdige Antwort erhalten hat, auf die meiner Erfahrung nach eine Antwort gegeben wurde

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

tu es nicht.

Das Einschränken der Entscheidungen, die ein Kunde bei der Anpassung treffen kann - ob in der Benutzeroberfläche oder in etwas anderem - ist für den Anbieter fast immer besser, da dies die Lösung vereinfacht und den Supportaufwand verringert - und auch für den Kunden -, weil er dies am besten kann Nutzen Sie das Know-how des Anbieters, um den Sweet Spot des Lösungsbereichs zu erreichen, ohne Ihre eigene Zeit damit zu verschwenden, das Rad neu zu erfinden.

Wenn sie eine andere Lösung benötigen, werden sie es Ihnen sagen. Wenn sie auf Anpassung bestehen, benötigen sie eine andere Lösung und wissen es einfach noch nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.