我最近开始使用非常棒的UICollectionView API,取得了合理的进展,但几乎整天都陷入困境,我希望有人可以帮助我:
我需要为某些单元格的属性添加一些自定义详细信息。 为了做到这一点,正确的方法似乎是子类UICollectionViewLayoutAttributes并将我需要的属性添加到我的子类。到目前为止一切都那么好,除了当我返回我的LayoutAttributesSubclass时,我总是得到,不知何故模糊,跟随错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
试图跟踪这一段时间后,我的印象是错误与RepresentElementKind和representElementCategory在我的子类实例中为nil有关。但这些属性是只读的,所以我不能设置它们。 我设法以某种方式通过欺骗,获取常规UICollectionViewAttributes实例,然后使用object_setClass将其更改为LayoutAttributesSubclass来绕过错误,但这会引发大量其他问题,而且对我来说似乎相当阴暗。
简而言之,有谁知道上面的错误意味着什么,以及如何正确创建/使用UICollectionViewLayoutAttributes子类?
答案 0 :(得分:12)
设置自定义属性时,需要将UICollectionViewLayoutAttributes 和子类UICollectionViewLayout子类化,并通过覆盖UICollectionViewLayout类中的+(Class)layoutAttributesClass来“声明”自定义属性子类类名。当您使用工厂方法实例化/出列布局属性对象时,系统调用此类方法以查看是否存在要提供的自定义类。
@interface YourCustomCollectionViewAttributes : UICollectionViewLayoutAttributes
@property (nonatomic) UIEdgeInsets myCustomProperty
@end
@interface YourCustomCollectionViewLayout : UICollectionViewLayout
@end
@implementation YourCustomCollectionViewLayout
+ (Class)layoutAttributesClass
{
return [IRTableCollectionViewLayoutAttributes class];
}
@end
根据文档这是正确的,应该可以防止您遇到的特定错误。此外,当您实现自定义iVars时,请确保为 - (id)copyWithZone实现覆盖:或者UICollectionView将丢失您应用于自定义集合视图对象的任何自定义值。