Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Initializing a custom UICollectionViewCell

I have a custom UICollectionViewCell that has a custom background view which is drawn using one of several colour schemes. The colour scheme for the background view is set in my custom initializer -(id)initWithFrame:andColourPalette: for the View.

I have a similar custom initialiser in my UICustomViewCell subclass but I can't figure out how to call this initialiser when I am setting up the cell in cellForItemAtIndexPath:

Can anyone help me do this? Or offer alternative solution for passing this Dictionary of colours into the Cell to pass on to the subView?

EDIT to show more detail:

This is what I have in my UICollectionView VC:

In ViewWillAppear:

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];
self.colourPalette = [OPOColourPalette greenyColourPalette];

In cellForItemAtIndexPath:

UICollectionViewCell *cell          = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_ID forIndexPath:indexPath];
OPOLawCollectionViewCell *lawCell   = (OPOLawCollectionViewCell *)cell;

MainLevel *level                    = self.collectionData[indexPath.row];
lawCell.delegate                    = self;
lawCell.colourPalette               = self.colourPalette;

In my Custom UICollectionViewCell

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // get background view
        OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:self.colourPalette];

But that doesn't work - I guess because the propertys are not set up.

If I change the last line to this, then it works fine:

    OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:[OPOColorPalette greenyColorPalette]];

So i guess I need to use a custom intialiser here but I cant figure out how to call it , or from where...

Thanks

like image 524
Bertie Avatar asked Dec 04 '22 10:12

Bertie


1 Answers

Yuo have to register your customCells in collectionView:

[self.collectionView_ registerClass:[YourCustomClass class]
        forCellWithReuseIdentifier:@"CustomCell"];

And then in your method cellForItemAtIndexPath:

 YourCustomClass *cell = (YourCustomClass *)[collectionView 
         dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];

It is done because collectionView might have 1000 cells and 10 visible. You don't keep all of them initialized and reuse when possible.

EDIT

You should set colorPaletter after you deque the reusable cell. Think of it as a container which can hold any color. You need to determine (by indexpath) what color to paint.

like image 89
Tala Avatar answered Dec 30 '22 07:12

Tala