Ich versuche, UICollectionViewCells mit dem Decorator-Muster zu dekorieren.
Zum Beispiel, wenn ich ein
habe %Vor%Ich würde gerne so etwas machen können:
%Vor%Ich denke, dass das Decorator-Muster für diese Art von Dingen ziemlich ordentlich ist, aber ich habe Schwierigkeiten, es auf Kollektionsansichten anzuwenden.
Zuerst müssen Sie in UICollectionViewControllern eine Klasse wie folgt registrieren:
%Vor%Ich habe also keine Gelegenheit, meine eigene Instanz zu erstellen.
Zweitens kann ich nicht sehen, wie der Dekorateur jemals nützlich sein kann, um "nicht-reine" Objekte zu dekorieren, das heißt Objekte, die ich nicht von Grund auf kreiert habe, sondern ihre eigenen Eigenschaften und Verhaltensweisen (wie z UICollectionViewCell). Da im obigen Beispiel cell
eine neue Instanz von LabelledCell darstellt, und wenn UICollectionView einen Aufruf für eine Methode ausführt, zB isSelected
, ruft dies aLabelledCellInstance.isSelected
auf, es sei denn, ich mache das spezifisch in meiner Decorator-Basisklasse:
Was für eine Methode in Ordnung ist, aber es scheint nicht richtig zu sein, jede Methode in UICollectionViewCell
zu überschreiben. Sollte ich forwardInvocation:
verwenden?
Mißbrauche ich dieses Muster, und gibt es Alternativen? Weil es sehr gut in Büchern funktioniert, wenn Sie einfach grundlegende Methoden wie
überschreiben müssen %Vor%.. scheint aber schwierig zu sein, um bestehende Benutzeroberflächenelemente mit benutzerdefiniertem Verhalten zu dekorieren.
Danke
EDIT: Was ich vermeiden möchte, ist Klassen wie folgt:
Auf dem Papier ist der Decorator der perfekte Kandidat für das, was ich erreichen möchte, aber die Umsetzung stört mich.
Zunächst müssen Sie im Decorator-Muster alle Basismethoden in BaseDecorator
überschreiben, damit Sie die Aufrufe an das dekorierte Objekt weiterleiten können.
Und Sie können dies tun, indem Sie jede einzelne Methode überschreiben oder vorzugsweise forwardInvocation:
verwenden. Und da alle anderen Dekoratoren Unterklassen von BaseDecorator
sind, können Sie jetzt einfach die Methoden überschreiben, die Sie ändern möchten.
Zweitens, für das Problem CollectionView
schlage ich vor, das Decorator-Muster mit der normalen UIView
s zu verwenden und dann die dekorierte Ansicht als contentView
der Zelle zu verwenden.
Lassen Sie uns ein Beispiel sehen:
Wir haben BaseCellView
class, was die Superklasse für alle Dekoratoren sein wird.
Und wir haben immer noch unsere Klasse BaseCell
, die eine Unterklasse von UICollectionViewCell
ist:
Nun wird UICollectionViewControllers
immer eine Instanz von BaseCell
erstellen und Ihnen die Möglichkeit geben, es zu konfigurieren, wobei Sie Folgendes tun:
Und du kannst trotzdem UICollectionViewCell
an den Decorator weiterleiten, wenn du das willst.
Hier ist ein Beitrag, in dem ich diese Technik beschrieben habe. Obwohl ich gewählt habe, die UITableView
und nicht die Zelle zu dekorieren, könnte sie leicht an Ihre Sammlungsansicht angepasst werden. Es ist ziemlich lange gelesen, so dass ich nur eine kurze Zusammenfassung hier machen werde:
respondsToSelector
und forwardingTargetForSelector
z.B.:
%Vor%Tags und Links iphone ios design-patterns decorator uicollectionview