gpt4 book ai didi

iphone - 装饰模式问题,iOS/UICollectionViewCells

转载 作者:可可西里 更新时间:2023-11-01 03:10:23 26 4
gpt4 key购买 nike

我正在尝试使用 Decorator 模式“装饰”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.

我认为 Decorator 模式对于这类事情来说非常简洁,但我很难将其应用于 Collection View 。

首先,在 UICollectionViewControllers 中你需要注册一个类,像这样:

 [self.collectionView registerClass:cellClass forCellWithReuseIdentifier:cellIdentifier];

所以我没有机会创建自己的实例。

其次,我看不出 Decorator 如何对装饰“非纯”对象有用,也就是说,我不是从头开始创建但有自己的属性和行为的对象(例如UICollectionViewCell)。因为在上面的示例中,cell 表示 LabelledCell 的新实例,如果 UICollectionView 调用方法,例如 isSelected,这将调用 aLabelledCellInstance。 isSelected 除非我在我的 Decorator 基类中专门这样做:

 - (BOOL)isSelected {
return self.decoratedCell.isSelected;
}

这对一种方法来说很好,但必须重写 UICollectionViewCell 中的每个方法似乎并不正确。我应该使用 forwardInvocation: 吗?

我是否滥用了这种模式,还有其他选择吗?因为当你只需要重写基本方法时它在书中工作得非常好

 getPrice() {
return decoratedObject.getPrice() + 1.10f;
}

.. 但似乎很难达到用自定义行为实际装饰现有 UI 元素的目的。

谢谢

编辑:我想避免的是有这样的类(class):

  • 发光的边框单元格
  • LabelledGlowingBorderedCell
  • 等等

在纸面上,装饰器是我想要实现的目标的完美候选者,但实现绝对难倒了我。

最佳答案

首先,Decorator 模式要求您覆盖 BaseDecorator 中的所有基本方法,以便您可以将调用转发给装饰对象。您可以通过重写每个方法或最好只使用 forwardInvocation: 来做到这一点。由于所有其他装饰器都是 BaseDecorator 的子类,您现在只需重写要更改的方法即可。

其次,对于CollectionView的问题,我建议使用普通UIView的Decorator模式,然后使用装饰 View 作为contentView 。让我们看一个例子:

我们有 BaseCellView 类,它将成为所有装饰器的父类(super class)。

BaseCellView : UIView;
GlowingCellView: BaseCellView;
BorderedCell: BaseCellView;
LabelledCell: BaseCellView;

我们还有 BaseCell 类,它是 UICollectionViewCell 的子类:

BaseCell : UICollectionViewCell;

现在,UICollectionViewControllers 将始终创建一个 BaseCell 实例,并为您提供配置它的机会,您将在此处执行以下操作:

BaseCellView *cellView = [[BaseCellView alloc] initWithFrame]
cellView = [[GlowingCellView alloc] initWithCellView:cellView];
cellView = [[BorderedCellView alloc] initWithCellView:cellView];
cellView = [[LabelledCellView alloc] initWithCellView:cellView];
cell.contentView = cellView;

如果需要,您仍然可以将任何 UICollectionViewCell 转发给装饰器。

关于iphone - 装饰模式问题,iOS/UICollectionViewCells,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com