子类化 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 文件中选择 UICollectionViewCell
如何以不同的方法访问 uicollectionviewcell 对象?