3

我最近开始使用很棒的 UICollectionView API,取得了合理的进展,但几乎整天都被困在一个问题上,我希望有人可以帮助我:

我需要为某些单元格的属性添加一些自定义细节。为了做到这一点,正确的方法似乎是继承 UICollectionViewLayoutAttributes 并将我需要的属性添加到我的子类中。到目前为止一切顺利,除了当我返回我的 LayoutAttributesSubclass 时,我总是得到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'

尝试追踪了一段时间后,我的印象是该错误与代表元素种类有关,并且代表元素类别在我的子类实例中为零。但是这些属性是只读的,所以我不能设置它们。我设法通过作弊以某种方式绕过错误,获取常规 UICollectionViewAttributes 实例,然后使用 object_setClass 将其更改为 LayoutAttributesSubclass,但这会引发大量其他问题,而且对我来说似乎相当阴暗。

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

4

1 回答 1

13

设置自定义属性时,您需要子类化 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

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

于 2012-09-24T08:18:04.647 回答