子类化UICollectionViewLayoutAttributes

Jer*_*iez 2 ios ios6 uicollectionview

我最近开始玩令人敬畏的UICollectionView API,取得了合理的进展,但几乎整天都遇到了问题,我希望有人可以帮助我:

我需要为某些单元格的属性添加一些自定义细节.为了做到这一点,正确的方法似乎是子类UICollectionViewLayoutAttributes并将我需要的属性添加到我的子类.到目前为止一切都那么好,除了当我返回我的LayoutAttributesSubclass时,我总是得到,不知何故模糊,跟随错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
Run Code Online (Sandbox Code Playgroud)

试图跟踪这一段时间后,我的印象是错误与RepresentElementKind和representElementCategory在我的子类的实例中是nil有关.但这些属性是只读的,所以我不能设置它们.我设法以某种方式通过欺骗,获取常规UICollectionViewAttributes实例,然后使用object_setClass将其更改为LayoutAttributesSubclass来绕过错误,但这会引发大量其他问题,而且对我来说似乎相当阴暗.

简而言之,有谁知道上面的错误意味着什么,以及如何正确创建/使用UICollectionViewLayoutAttributes子类?

The*_*ind 12

设置自定义属性时,需要通过覆盖UICollectionViewLayout类中的+(Class)layoutAttributesClass 来子类化UICollectionViewLayoutAttributes 子类UICollectionViewLayout并"声明"自定义属性子类类名.系统调用此类方法,以查看在使用工厂方法实例化/出列布局属性对象时是否存在要提供的自定义类.

@interface YourCustomCollectionViewAttributes : UICollectionViewLayoutAttributes

@property (nonatomic)               UIEdgeInsets        myCustomProperty                        

@end

@interface YourCustomCollectionViewLayout : UICollectionViewLayout

@end

@implementation YourCustomCollectionViewLayout

+ (Class)layoutAttributesClass
{
    return [IRTableCollectionViewLayoutAttributes class];
}

@end
Run Code Online (Sandbox Code Playgroud)

根据文档,这是正确的,应该可以防止您遇到的特定错误.此外,当您实现自定义iVars时,请确保为 - (id)copyWithZone实现覆盖:或者UICollectionView将丢失您应用于自定义集合视图对象的任何自定义值.

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