子类化 UICollectionViewCell 导致永远不会被选中

Posted

技术标签:

【中文标题】子类化 UICollectionViewCell 导致永远不会被选中【英文标题】:Subclassing UICollectionViewCell leads to never being selected 【发布时间】:2013-03-22 20:00:50 【问题描述】:

我尝试子类化 UICollectionViewCell 并从 nib 文件加载:

- (id)initWithFrame:(CGRect)frame 
    self = [super initWithFrame:frame];
    if (self) 
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"DatasetCell" owner:self options:nil];

        if ([arrayOfViews count] < 1) 
            return nil;
        

        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) 
            return nil;
        

        self = [arrayOfViews objectAtIndex:0];

        UIView *view = [UIView new];
        view.frame = self.frame;
        view.backgroundColor = [UIColor orangeColor];
        self.selectedBackgroundView = view;
    

    return self;

我遇到了一个问题,即选择了一个单元格,cell.selected 没有被设置。始终是NO,这会导致取消选择单元格的问题。

如何处理使单元格进入选定状态?

编辑:

我最初将自定义 UICollectionViewCell 作为一个类加载:

[collectionView registerClass:[DatasetCell class] forCellWithReuseIdentifier:@"dataCell"];

切换到加载笔尖:

[collectionView registerNib:[UINib nibWithNibName:@"DatasetCell" bundle:nil] forCellWithReuseIdentifier:@"nibCell"];

两种方式都有相同的选择/取消选择问题。

【问题讨论】:

您在分配 view.frame = self.frame 之前覆盖了 self 的值 - 这看起来很可疑。 为什么需要这段代码?如果您在集合视图控制器中使用registerNib:forCellWithReuseIdentifier:dequeueReusableCellWithReuseIdentifier:forIndexPath:,则直接从NIB 文件加载自定义单元格。 我的笔尖有我需要更改值的标签。这是我第一次使用笔尖(通常以编程方式进行)。我做错了吗? 我不是 100% 确定,但我认为您可以在视图控制器中使用上面提到的 2 种方法。在表格视图子类中,您可以覆盖 awakeFromNib 进行修改。 好的,我把它从加载类改成了加载笔尖。选择和取消选择按预期工作,但我不确定现在如何访问其中的 UILabel。我将笔尖的类从 MyCustomUICollectionView 更改为 UICollectionViewClass。 【参考方案1】:

主要的错误是你定义了一个属性

@property (nonatomic) BOOL isSelected;

在您的自定义 UICollectionViewCell 子类中(在“DatasetCell.h”中),这会干扰 UICollectionViewCell 的继承“selected”属性。

如果您删除该属性定义,则选择和取消选择将按预期工作,至少对于通过 registerNib:... 从 nib 文件加载的单元格而言。

对于通过registerClass:... 加载的单元格,调用initWithFrame。您尝试从那里的 nib 文件加载单元格。这没有多大意义,而且似乎无法正常工作。您应该在initWithFrame 中以编程方式创建单元格并使用registerClass:,或者在nib 文件中创建单元格并使用registerNib:

initWithFrame 不会为从 nib 文件加载的单元格调用,如果要对单元格进行修改,请使用 awakeFromNib

希望有帮助!!

【讨论】:

对于 UICollectionViewCell 子类,即使没有使用自定义 XIB,是否应该使用 awakeFromNib 来初始化 IB 插座属性(例如位置、宽度)?

以上是关于子类化 UICollectionViewCell 导致永远不会被选中的主要内容,如果未能解决你的问题,请参考以下文章

子类化从 xib 创建的自定义视图

无法在 xib 文件中选择 UICollectionViewCell

如何以不同的方法访问 uicollectionviewcell 对象?

UICollectionViewCell 子类问题

将子视图添加到 UICollectionViewCell 子类?

试图确定子类 UICollectionViewCell 中的单元格宽度