初始化自定义UICollectionViewCell

时间:2013-07-01 13:54:23

标签: ios ipad uicollectionview uicollectionviewcell

我有一个自定义UICollectionViewCell,其自定义背景视图使用多种配色方案之一绘制。背景视图的颜色方案在我的自定义初始值设定项-(id)initWithFrame:andColourPalette:中为视图设置。

我的UICustomViewCell子类中有一个类似的自定义初始化程序,但在cellForItemAtIndexPath:

中设置单元格时,我无法弄清楚如何调用此初始化程序

任何人都可以帮我这样做吗?或者提供替代解决方案,将此色彩词典传递给Cell以传递给subView?

编辑以显示更多详细信息:

这就是我在UICollectionView VC中的内容:

在ViewWillAppear中:

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];
self.colourPalette = [OPOColourPalette greenyColourPalette];

在cellForItemAtIndexPath中:

UICollectionViewCell *cell          = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_ID forIndexPath:indexPath];
OPOLawCollectionViewCell *lawCell   = (OPOLawCollectionViewCell *)cell;

MainLevel *level                    = self.collectionData[indexPath.row];
lawCell.delegate                    = self;
lawCell.colourPalette               = self.colourPalette;

在我的自定义UICollectionViewCell

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // get background view
        OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:self.colourPalette];

但这不起作用 - 我猜是因为没有设置属性。

如果我将最后一行更改为此,那么它可以正常工作:

    OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:[OPOColorPalette greenyColorPalette]];

所以我想我需要在这里使用自定义的intialiser,但我无法弄清楚如何调用它,或者从哪里...

由于

3 个答案:

答案 0 :(得分:12)

Yuo必须在collectionView中注册您的customCell:

[self.collectionView_ registerClass:[YourCustomClass class]
        forCellWithReuseIdentifier:@"CustomCell"];

然后在你的方法cellForItemAtIndexPath

 YourCustomClass *cell = (YourCustomClass *)[collectionView 
         dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];

这样做是因为collectionView可能有1000个单元格,10个可见。在可能的情况下,您不会将所有这些文件初始化并重新使用。

修改

取消可重复使用的单元格后,应设置colorPaletter。可以把它想象成一个可以容纳任何颜色的容器。您需要确定(通过索引路径)要绘制的颜色。

答案 1 :(得分:2)

如果您的自定义单元格位于Storyboard

,则不应在下方执行此操作
[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

因为Storyboard负责注册Cell_ID拥有。 现在,如果同时使用两者,那么生成无效Cell会发生冲突。

答案 2 :(得分:2)

离开,每个答案。提问者正在寻找一种在初始化时唯一识别每个单元的方法,这种方法在单元格出列之前,以及在单元格访问其索引路径属性之前进行。

执行此操作的唯一方法是根据索引路径值为每个单元格分配唯一的重用标识符(假设您将知道它将是什么,并且在您的情况下,您将会这样做);然后,在将单元格出列时,使用索引路径查找具有相应重用标识符的单元格。

这是否否定了重用标识符的目的?绝对不。每次需要再次使用时,您都会重复使用该单元格。重用标识符并不意味着将您限制在集合视图中每个单元格的cookie-cutter单元格中;它们也有意使用"独特的用途"身份标识。