iOS 子类 UICollectionViewCell 自定义 init 方法

Posted

技术标签:

【中文标题】iOS 子类 UICollectionViewCell 自定义 init 方法【英文标题】:iOS Subclass UICollectionViewCell custom init method 【发布时间】:2012-12-22 01:03:21 【问题描述】:

我正在实现一个自定义 UICollectionViewCell,我想知道如何将模型数据发送给它,以便可以使用数据来初始化单元格的子视图。

我通过这样做来注册我的 MyCollectionViewCell..

[self.collectionView registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCell"];

在下面的方法中,我做到了……

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

MyCollectionViewCell* cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];

我面临的问题是,当一个单元格不在重用队列中时,它会通过调用 initWithFrame 方法来初始化一个新单元格(文档确认应该这样做)。但是,我的 MyCollectionViewCell 类中有一个自定义的 init 方法,它是......

-(id) initWithFrame:(CGRect)frame withData: (NSDictionary*) data;

我希望改为调用我的自定义初始化方法。我该怎么做?我没有使用任何笔尖,而是以编程方式进行所有操作。

如果没有办法,我必须改用 initWithFrame 方法,我还能如何将模型数据传递给 MyCollectionViewCell 以便我可以使用该数据初始化子视图?

谢谢!

【问题讨论】:

【参考方案1】:

[cell initData:data] 在你出队之后怎么样?无论如何,您可能需要重新初始化出队单元格上的数据。

【讨论】:

这个。如果你重用一个单元格,你不会向它传递 initWith... 任何东西,因此设置数据应该与 init 方法分开。 除了,别叫它initData。称它为 configureForData 或 setData (如果数据是一个属性)的东西。 init... 方法只能在新分配的对象上调用。 这是有道理的。在我调用 setData 并传入我的模型数据后,如何触发单元格重新加载它的 UI?我是否调用 setNeedsLayout 并在我的自定义单元格中有一个 -(void) layoutSubviews 方法? 除非您动态更改视图的大小,否则您不需要/不想再次对其进行布局。不要忘记,此时单元格是不可见的。您需要做的所有事情(例如)就是在标签上设置文本,并使用新数据。【参考方案2】:

另一种选择是为您的 layoutAttributes 对象提供指向数据的指针,并让单元格在其 applyLayoutAttributes: 方法中从那里抓取它。

【讨论】:

以上是关于iOS 子类 UICollectionViewCell 自定义 init 方法的主要内容,如果未能解决你的问题,请参考以下文章

IOS 获取父类的所有子类

iOS 12 上的 UISearchController 子类崩溃

IOS 5 UIDocument 子类向后兼容吗?

ios UIActivity子类的不同图像大小

基于 iOS 版本的条件子类化

iOS分类延展和子类的区别