子类化自定义UICollectionViewCell

时间:2016-07-21 14:07:36

标签: ios objective-c iphone uicollectionview

我已经成功创建了包含3个标签的自定义UICollectionViewCell。

现在我要将其子类化,添加dateToDisplay属性,并在setDateToDisplay中更改标签的字符串(使用自定义日期格式化程序)。

创建和使用parentCell:

ParentCellIdentifier.h    
static NSString *ParentCellIdentifier = @"ParentCellIdentifier";

@interface ParentCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UILabel *firstLabel;
@property (strong, nonatomic) IBOutlet UILabel *secondLabel;
@property (strong, nonatomic) IBOutlet UILabel *thirdLabel;

-(void)setupDefaults;
@end

在parentCell.xib中:

类设置为ParentCell,标识符设置为ParentCellIdentifier

在ViewController中,我有UICollectionView

-(void)setupCollectionView {
     [_daysCollectionView registerNib:[UINib nibWithNibName:@"ParentCell" bundle:nil] forCellWithReuseIdentifier:ParentCellIdentifier];
    _daysCollectionView.delegate = self;
    _daysCollectionView.dataSource = self;
    _daysCollectionView.backgroundColor = [UIColor clearColor];
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
ParentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ParentCellIdentifier forIndexPath:indexPath];
    cell.firstLabel.text = @"first";
    cell.secondLabel.text = @"second";
}

上面的设置就像一个魅力。 不,我想添加ChildCell,使用与之前相同的xib:

@interface ChildCell : ParentCell
@property (nonatomic, strong) NSDate* dateToDislpay;//labels of parentCell updated using dateformatters on setDateToDisplay:
@end

-(void)setupCollectionView保留相同的内容,为ParentCellIdentifier注册ParentCell.xib

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    ChildCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ParentCellIdentifier forIndexPath:indexPath];
    NSDate* date = [_dates objectAtIndex:indexPath.row];
    cell.dateToDislpay = date; //here goes the error

当尝试设置子单元格的属性时,它会崩溃。这是正确的,因为在ParentCell.xib类中,单元格是ParentCell。 在xib中更改类后,它可以工作,但我想在xib中坚持使用我的父类,因为我将使用相同的xib,但只使用不同的格式化程序。

我该怎么做?

EDIT1: 收到了崩溃:

-[ParentCell setDateToDislpay:]: unrecognized selector sent to instance

2 个答案:

答案 0 :(得分:0)

您需要进入xib文件并将类类型更改为ChildCell,这样可以解决您的崩溃问题。

要继承,请参阅此处:https://stackoverflow.com/a/5056886/848719

您必须覆盖initWithFrame:awakeFromNib

答案 1 :(得分:0)

因为您已注册[UINib nibWithNibName:@"ParentCell" bundle:nil]父级单元格并且在单元格的单元格中您创建了ChildCell的对象,所以您崩溃了,但它是父级单元格而非子级单元格 和父单元格没有dateToDislpay属性。

你可以用打印类检查

你正在以错误的方式做继承,你应该阅读一些教程或阅读一些演示