Subclassando UICollectionViewLayoutAttributes

Recientemente comencé a jugar con la increíble API de UICollectionView, logrando un progreso razonable, pero me he quedado atascado casi todo el día con un problema. Espero que alguien pueda ayudarme:

Necesito agregar algunos detalles personalizados a los attributes de ciertas celdas. Para hacer esto, el enfoque correcto parece ser subclass UICollectionViewLayoutAttributes y agregar las properties que necesito a mi subclass. Hasta ahora, bueno, excepto que cuando devuelvo mi LayoutAttributesSubclass, siempre obtengo el siguiente error, de alguna manera oscuro:

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

Después de haber tratado de rastrear esto durante un time, tengo la printing de que el error está relacionado con representedElementKind y representedElementCategory siendo nil en la instancia de mi subclass. Pero esas properties son de solo lectura, así que no puedo configurarlas. De alguna manera, he logrado evitar el error haciendo trampas, obteniendo una instancia regular de UICollectionViewAttributes, y luego cambiándola a una LayoutAttributesSubclass usando object_setClass, pero esto plantea muchos otros problemas, además me parece bastante sombrío.

En resumen, ¿alguien sabe qué significa el error anterior y cómo crear / usar subclasss UICollectionViewLayoutAttributes correctamente?

Al configurar los attributes personalizados, debe subclasificar UICollectionViewLayoutAttributes y la subclass UICollectionViewLayout y "declarar" su nombre de class de class de subclass de atributo personalizado anulando + (Clase) layoutAttributesClass en su class UICollectionViewLayout. El sistema llama a este método de class para ver si hay una class personalizada que se debe suministrar cuando utiliza el método de fábrica para crear objects de atributo de layout de creación de instancias / dequequeue.

 @interface YourCustomCollectionViewAttributes : UICollectionViewLayoutAttributes @property (nonatomic) UIEdgeInsets myCustomProperty @end @interface YourCustomCollectionViewLayout : UICollectionViewLayout @end @implementation YourCustomCollectionViewLayout + (Class)layoutAttributesClass { return [IRTableCollectionViewLayoutAttributes class]; } @end 

Esto es correcto de acuerdo con la documentation y debe evitar el error particular que está teniendo. Además, cuando implemente iVars personalizados, asegúrese de implementar una anulación para – (id) copyWithZone: o UICollectionView perderá los valores personalizados que haya aplicado a su object de vista de colección personalizada.