UICollectionViewLayoutAttributes子类在自定义属性中返回nil

时间:2012-10-05 02:49:58

标签: iphone ios ios6

我已经将UICollectionViewLayoutAttributes类子类化,并添加了一些自定义属性。

在我的自定义UICollectionViewLayout类中,我重写了静态 + (Class)layoutAttributesClass然后我返回我的新属性类。

在我的UICollectionViewLayout类中,我覆盖了-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect,并将值设置为自定义属性。

我可以在那里检查属性类,看看是否正确设置了自定义属性。

所以,最后我需要在UICollectionViewCell中检索这些属性,所以我重写-(void) applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes来获取自定义UICollectionViewLayoutAttributes类中的值,YET它们是nil。好像我从来没有设置它们。

所有其他属性都完美运行,包括转换等。很清楚,我做错了什么。请指教。

包含我自定义类的HeaderFile

@interface UICollectionViewLayoutAttributesWithColor : UICollectionViewLayoutAttributes

@property (strong,nonatomic) UIColor *color;

@end

这是实施。如你所见,没什么特别的

@implementation UICollectionViewLayoutAttributesWithColor

@synthesize color=_color;

@end

3 个答案:

答案 0 :(得分:26)

你会很高兴知道答案很简单。您只需要覆盖copyWithZone:因为UICollectionViewAttributes实现了NSCopying协议。正在发生的事情是Apple代码正在制作自定义属性对象的副本,但由于您尚未实现copyWithZone,因此您的自定义属性不会被复制到新对象。以下是您需要做的一个示例:

@interface IRTableCollectionViewLayoutAttributes : UICollectionViewLayoutAttributes {
    CGRect _textFieldFrame;
}

@property (nonatomic, assign) CGRect  textFieldFrame;

@end

和实施:

- (id)copyWithZone:(NSZone *)zone
{
    IRTableCollectionViewLayoutAttributes *newAttributes = [super copyWithZone:zone];
    newAttributes->_textFieldFrame = _textFieldFrame;

    return newAttributes;
}

答案 1 :(得分:1)

删除自定义值的问题是因为我们必须实现-copyWithZone:因为UICollectionViewLayoutAttributes实现并使用NSCopying

答案 2 :(得分:0)

听起来您正在尝试将布局属性应用于单元格。可以这样做:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //Get Cell
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

    //Apply Attributes
    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    [cell applyLayoutAttributes:attributes];

    return cell;
}

但是,在我的UICollectionView实现中,我只是将自定义属性添加到UICollectionViewCell的子类而不是UICollectionViewLayoutAttributes的子类。我认为在大多数情况下,子类化UICollectionViewCell更有效:

@interface ColoredCollectionCell : UICollectionViewCell
@property (strong,nonatomic) UIColor *color;
@end

@implementation ColoredCollectionCell
// No need to @synthesize in iOS6 sdk
@end

在您的集合视图控制器中:

- (UICollectionViewCell*)collectionView:(UICollectionView*)cv cellForItemAtIndexPath:(NSIndexPath*)indexPath
{
    //Get the Cell
    ColoredCollectionCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

    //Get the color from Array of colors
    UIColor *thisColor = self.colorsArray[indexPath.item];

    //Set cell color
    cell.color = thisColor;

    return cell;

}