3

私は最近、すばらしいUICollectionView APIで遊んで、かなりの進歩を遂げましたが、誰かが私を助けてくれることを望んでいる問題で、ほぼ1日中立ち往生しています。

特定のセルの属性にカスタムの詳細を追加する必要があります。これを行うための正しいアプローチは、UICollectionViewLayoutAttributesをサブクラス化し、必要なプロパティをサブクラスに追加することであるように思われます。これまでのところ、LayoutAttributesSubclassを返すと、次のエラーが発生します。

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

これをしばらく追跡しようとしましたが、エラーは、サブクラスのインスタンスでrepresentedElementKindとrepresentedElementCategoryが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 に答える