dequeueReusableCellWithReuseIdentifier不通过init或initWithCoder函数

时间:2014-06-09 14:07:47

标签: ios objective-c uicollectionview

UICollectionView创建单元格时,dequeueReusableCellWithReuseIdentifier不会通过init的{​​{1}}和initWithCoder功能。

视图正在创建,它具有正确的类型(CategoryView),但未调用CategoryViewinit initWithCoder,因此不执行基本功能。在这个场景中还有其他一些初始化吗?

CategoryView

5 个答案:

答案 0 :(得分:1)

在这种情况下,问题是未在Interface Builder中为您的单元原型指定基类。因此,请确保已设置基类:

enter image description here

然后,当您使用在原型单元格中指定的故事板标识符调用dequeueReusableCellWithReuseIdentifier时,它会在首次实例化单元格时调用initWithCoder。如果单元格滚出视图但稍后重新用于另一个NSIndexPath,则会调用prepareForReuse

@interface CategoryView : UICollectionViewCell

@end

@implementation CategoryView

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        NSLog(@"init");
    }
    return self;
}

- (void)prepareForReuse {
    [super prepareForReuse];
    NSLog(@"reuse");
}

@end

答案 1 :(得分:1)

UICollectionViews和UITableViews重用单元格以提高性能。 initWithCoder:每个可重用的单元格只运行一次。因此,如果您需要在每次显示单元格时调用,我建议您在cellForRowAtIndexPath:方法中编写如下方法:

- (CategoryView *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    CategoryView *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CategoryView" forIndexPath:indexPath]; 

    // self.parameters = an NSDictionary of the colors, text, etc. you need to the cell to know about
    [cell configureWithParameters:self.parameters];

    return cell;
}

然后,在configureWithParameters:方法中,您可以包含颜色,文本等,以帮助您设置CategoryView。

您必须在CateogryView.h中声明configureWithParameters:方法,如下所示:

// CategoryView.h
- (void)configureCell:(NSDictionary *)parameters;

然后在.m中包含您的自定义项,如下所示:

// CategoryView.m
- (void)configureCell:(NSDictionary *)parameters{
    // Put Whatever initialization code you need here
    // Example:
    self.label.textColor = parameters["color"];
    self.label.text = parameters["text"];
}

答案 2 :(得分:1)

  • 确保您已将集合视图委托/数据源连接到您的班级。
  • 确保为单元格提供基类。
  • 确保您的单元格具有重用标识符。
  • 确保为您的重用标识符注册Nib。 (如果您的单元格出现在故事​​板中的集合视图中,则不需要这样做。)

最后尝试更改

- (CategoryView *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {

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

现在你的

- (instancetype)initWithCoder:(NSCoder *)aDecoder

应该被召唤。

答案 3 :(得分:1)

假设您已经将UICollectionViewCell子类化,您可以将初始化代码放在awakeFromNib()中。

答案 4 :(得分:1)

尝试- (instancetype)initWithFrame:(CGRect)frame

它对我有用。我以编程方式编写了UI。

祝你好运!