Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subclassing UICollectionViewLayoutAttributes

I recently started playing with the awesome UICollectionView API, making reasonable progress, but have been stuck for almost all day with an issue I'm hoping someone can help me with:

I need to add some custom details to certain cells' attributes. In order to do this, the right approach seem to be to subclass UICollectionViewLayoutAttributes and add the properties I need to my subclass. So far so good, except that when I return my LayoutAttributesSubclass, I always get the, somehow obscure, following error:

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

Having tried to track this down for a while, I'm under the impression that the error is related to representedElementKind and representedElementCategory being nil in my subclass's instance. But those properties are read only, so I can't set those. I've managed to somehow bypass the error by cheating, getting a regular UICollectionViewAttributes instance, then changing it to a LayoutAttributesSubclass using object_setClass, but this then raises a ton of other issues, plus seems rather shady to me.

In short, does anyone knows what the error above means, and how to correctly create/use UICollectionViewLayoutAttributes subclasses?

like image 225
Jerome Cordiez Avatar asked May 19 '26 20:05

Jerome Cordiez


1 Answers

When setting up custom attributes, you need to subclass UICollectionViewLayoutAttributes and subclass UICollectionViewLayout and "declare" your custom attribute subclass class name by overriding +(Class)layoutAttributesClass in your UICollectionViewLayout class. The system calls this class method to see if there is a custom class to be supplied when you use the factory method for instantiating/dequeuing layout attribute objects.

@interface YourCustomCollectionViewAttributes : UICollectionViewLayoutAttributes

@property (nonatomic)               UIEdgeInsets        myCustomProperty                        

@end

@interface YourCustomCollectionViewLayout : UICollectionViewLayout

@end

@implementation YourCustomCollectionViewLayout

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

@end

This is correct according to the documentation and should prevent the particular error you are having. Also when you implement custom iVars, be sure to implement an override for -(id)copyWithZone: or the UICollectionView will lose any custom values you have applied to your custom collection view object.

like image 144
TheBasicMind Avatar answered May 21 '26 15:05

TheBasicMind



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!