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

Jas*_*gun 11 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
Run Code Online (Sandbox Code Playgroud)

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

@implementation UICollectionViewLayoutAttributesWithColor

@synthesize color=_color;

@end
Run Code Online (Sandbox Code Playgroud)

The*_*ind 26

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

@interface IRTableCollectionViewLayoutAttributes : UICollectionViewLayoutAttributes {
    CGRect _textFieldFrame;
}

@property (nonatomic, assign) CGRect  textFieldFrame;

@end
Run Code Online (Sandbox Code Playgroud)

和实施:

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

    return newAttributes;
}
Run Code Online (Sandbox Code Playgroud)