4

我有一个自定义UICollectionViewCell的自定义背景视图,该视图是使用几种配色方案之一绘制的。背景视图的配色方案在我-(id)initWithFrame:andColourPalette:的视图自定义初始化程序中设置。

我的UICustomViewCell子类中有一个类似的自定义初始化程序,但是当我设置单元格时,我无法弄清楚如何调用这个初始化程序cellForItemAtIndexPath:

谁能帮我做到这一点?或者提供替代解决方案来将此颜色字典传递到单元格中以传递给子视图?

编辑以显示更多细节:

这就是我的 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]];

所以我想我需要在这里使用自定义初始化程序,但我不知道如何调用它,或者从哪里调用它......

谢谢

4

3 回答 3

12

你必须在collectionView中注册你的customCells:

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

然后在你的方法中cellForItemAtIndexPath

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

这样做是因为 collectionView 可能有 1000 个单元格和 10 个可见的。如果可能,您不会将它们全部初始化并重用。

编辑

您应该colorPaletter在 deque 可重用单元后设置。把它想象成一个可以容纳任何颜色的容器。您需要确定(通过索引路径)要绘制什么颜色。

于 2013-07-01T14:00:05.893 回答
2

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

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

因为Storyboard有责任注册Cell_ID自己。现在,如果同时使用两者,生成无效单元格会发生冲突。

于 2014-05-16T01:52:28.630 回答
2

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

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

这是否否定了重用标识符的目的?绝对不。每次您需要再次使用它时,您都会重复使用该单元格。重用标识符并不意味着将您限制为集合视图中每个单元格的千篇一律的单元格;它们也旨在成为“独特用途”的标识符。

于 2016-07-25T07:48:09.550 回答