初始化自定义 UICollectionViewCell

Posted

技术标签:

【中文标题】初始化自定义 UICollectionViewCell【英文标题】:Initializing a custom UICollectionViewCell 【发布时间】:2013-07-01 13:54:23 【问题描述】:

我有一个自定义的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]];

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

然后在你的方法cellForItemAtIndexPath:

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

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

编辑

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

【讨论】:

我已经这样做了,但是我需要告诉单元格用什么颜色来绘制背景图形。如果我在 Cell 上放置 colourPalette 的属性,然后在 cellForItemAtIndexPath 中设置它:它不起作用,因为在单元格绘制它的背景之前没有设置该属性。所以我想我需要重写 initWithFrame: 所以它使用我的 initWithFrame:andColourPalette: 方法。 你不应该在初始化时将任何东西绑定到单元格的索引。您需要能够在使单元出列后进行这些自定义。 我真的不需要将它绑定到单元格的索引。只是如果从这个 collectionView 调用单元格,它需要是一种特定的颜色...如果它是从不同的 CollectionView 调用的,它需要是另一种颜色。 Tala,感谢您的尝试,但这听起来像是我正在做的事情。我不希望细胞是不同的颜色,我希望它们都一样。我只是想在不同 ViewController 上的不同集合视图中使用相同的单元格类,但它们都具有不同的颜色 出列单元格后设置颜色有什么问题?【参考方案2】:

如果您的自定义单元格位于Storyboard 中,则不应执行以下操作,

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于初始化自定义 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

WCF 自定义验证器:如何从自定义验证器初始化“用户”对象

使用 @Namespace 为 .matchedGeometryEffect 自定义初始化

添加自定义块时自定义 config.js 未初始化,但在刷新时出现

创建并初始化自定义 UITabBarItem 类

UIVIewController 自定义初始化方法

初始化自定义类 UIVIew