デコレータパターンを使用してUICollectionViewCellsを「装飾」しようとしています。
たとえば、私が持っている場合
BaseCell : UICollectionViewCell
私はこのようなことをしたいと思っています:
BaseCell *cell = [[BaseCell alloc] initWithFrame]
cell = [[GlowingCell alloc] initWithCell:cell];
cell = [[BorderedCell alloc] initWithCell:cell];
cell = [[LabelledCell alloc] initWithCell:cell];
// cell is now a glowing, bordered, labelled cell.
デコレータパターンはこの種のものにはかなりきれいだと思いますが、コレクションビューに適用するのは難しいです。
まず、UICollectionViewControllersで、次のようにクラスを登録する必要があります。
[self.collectionView registerClass:cellClass forCellWithReuseIdentifier:cellIdentifier];
そのため、自分のインスタンスを作成する機会がありません。
次に、デコレータが「純粋でない」オブジェクト、つまり、ゼロから作成したのではなく、独自のプロパティと動作(UICollectionViewCellなど)を持つオブジェクトを装飾するのにどのように役立つかがわかりません。上記の例では、cell
はLabelledCellの新しいインスタンスを表しているため、UICollectionViewがメソッドを呼び出す場合、たとえば、Decorator基本クラスで特にこれを行わない限りisSelected
、これは呼び出されます。aLabelledCellInstance.isSelected
- (BOOL)isSelected {
return self.decoratedCell.isSelected;
}
これは1つのメソッドには問題ありませんが、のすべてのメソッドをオーバーライドする必要があるとは限りませんUICollectionViewCell
。使用する必要がありforwardInvocation:
ますか?
私はこのパターンを悪用していますか?代替手段はありますか?なぜなら、次のような基本的なメソッドをオーバーライドする必要がある場合に、本で非常にうまく機能するからです。
getPrice() {
return decoratedObject.getPrice() + 1.10f;
}
..しかし、既存のUI要素をカスタム動作で実際に装飾するという目的に合わせるのは難しいようです。
ありがとう
編集:私が避けようとしているのは、次のようなクラスを持つことです:
- GlowingBorderedCell
- LabelledGlowingBorderedCell
- 等
紙の上では、デコレータは私が達成しようとしていることの完璧な候補ですが、実装は絶対に私を困惑させています。