为UICollectionView
创建单元格时,dequeueReusableCellWithReuseIdentifier
不会通过init
的{{1}}和initWithCoder
功能。
视图正在创建,它具有正确的类型(CategoryView
),但未调用CategoryView
或init
initWithCoder
,因此不执行基本功能。在这个场景中还有其他一些初始化吗?
CategoryView
答案 0 :(得分:1)
在这种情况下,问题是未在Interface Builder中为您的单元原型指定基类。因此,请确保已设置基类:
然后,当您使用在原型单元格中指定的故事板标识符调用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)
最后尝试更改
- (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。
祝你好运!