Probleme mit Decorator-Muster, iOS / UICollectionViewCells

8

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:

%Vor%

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:

  • GlowingBorderedCell
  • LabelledGlowingBorderedCell
  • usw.

Auf dem Papier ist der Decorator der perfekte Kandidat für das, was ich erreichen möchte, aber die Umsetzung stört mich.

    
Sam 01.02.2013, 18:07
quelle

2 Antworten

4

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.

%Vor%

Und wir haben immer noch unsere Klasse BaseCell , die eine Unterklasse von UICollectionViewCell ist:

%Vor%

Nun wird UICollectionViewControllers immer eine Instanz von BaseCell erstellen und Ihnen die Möglichkeit geben, es zu konfigurieren, wobei Sie Folgendes tun:

%Vor%

Und du kannst trotzdem UICollectionViewCell an den Decorator weiterleiten, wenn du das willst.

    
Hejazi 01.02.2013, 19:21
quelle
3

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:

  • Der Decorator muss ein Proxy-Objekt sein, um alle Nachrichten an das dekorierte Objekt
  • weiterleiten zu können
  • Es gibt mehrere Methoden, die Sie in Ihrem Decorator überschreiben müssen, um dies zu erreichen, unter anderem respondsToSelector und forwardingTargetForSelector
  • Wenn Sie fertig sind, werden Sie in der Lage sein, die Dekorateure zu verketten, was ziemlich nett ist:

z.B.:

%Vor%     
Valentin Radu 01.02.2013 19:34
quelle