Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cellForItemAtIndexPath , sizeForItemAtIndexPath , insetForSectionAtIndex not getting invoked iOS

I am using a collectionView to show images after fetching from Coredatabase. However , none on the methods are being called except numberOfItemsInSection & numberOfSectionsInCollectionView. The delegates and data source are set properly.

Also the identifier of cell is photoCell and class is JLTPhotoCell.

- (void)viewDidLoad
        {
            [super viewDidLoad];
            _thumbNails = [[NSArray alloc]init]; // its declared ,don't worry about this
            _thumbNails = [[LADataModelController getSingleton] getAllSignatures];

            UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
            [layout setItemSize:( CGSizeMake(50,50))];
            [_collectionView setCollectionViewLayout:layout];
            self.collectionView.delegate = self;
            self.collectionView.dataSource = self;
            [_collectionView registerClass:[JLTPhotoCell class] forCellWithReuseIdentifier:@"photoCell"];
            [self.view addSubview:self.collectionView];
            self.collectionView.allowsSelection = true;
    }

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
    NSLog(@"count %i" , _thumbNails.count);
    return _thumbNails.count;
}

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (_thumbNails.count > 0)
    {
        JLTPhotoCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"photoCell" forIndexPath:indexPath];

        NSData *thumbnailData = ((LASignature*)[_thumbNails objectAtIndex:indexPath.row]).signatureImage;
        UIImage* thumbnailImage = [UIImage imageWithData:thumbnailData];
        [cell setThumbnail:thumbnailImage];
        NSLog(@"image:%@",thumbnailImage);

        if (!_buttonSelect.hidden)
        {
            [cell performSelected:FALSE];
        }

        return cell;
    }

    return nil;
}

#pragma mark UICollectionViewDelegate Methods

-(void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    _lastSelectedSign = [_thumbNails objectAtIndex:indexPath.row];

    if (!self.buttonSelect.hidden)
    {
        JLTPhotoCell *cell = (JLTPhotoCell *)[_collectionView cellForItemAtIndexPath:indexPath];
        cell.selected = FALSE;

    }
    else
    {
        [_selectedImages addObject:[_thumbNails objectAtIndex:indexPath.row]];
        JLTPhotoCell *cell = (JLTPhotoCell *)[_collectionView cellForItemAtIndexPath:indexPath];
        [cell performSelected:TRUE];
      //  _buttonDelete.enabled = _selectedImages.count > 0;
    }

}

-(void) collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [_selectedImages removeObject:[_thumbNails objectAtIndex:indexPath.row]];

    JLTPhotoCell *cell = (JLTPhotoCell *)[_collectionView cellForItemAtIndexPath:indexPath];
    [cell performSelected:FALSE];
    _buttonDelete.enabled = _selectedImages.count > 0;

}

#pragma mark - UICollectionViewDelegateFlowLayout
-(CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
   return  CGSizeMake(50,50) ;
}

-(UIEdgeInsets) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewFlowLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    collectionViewLayout.minimumInteritemSpacing=1;
    collectionViewLayout.minimumLineSpacing =2;
    return UIEdgeInsetsMake(1, 1, 1, 1);
}

jltPhotoCell Class
-(void) setThumbnail:(UIImage *) thumbnail
{
    [self setThumbnail:thumbnail andWithSize:(CGSizeMake(50,50))];
}

-(void) setThumbnail:(UIImage *) thumbnail andWithSize:(CGSize) size
{
    UIImageView *thumbImageView = [[UIImageView alloc] initWithImage:thumbnail];
    thumbImageView.frame = CGRectMake(0,0,size.width,size.height);
    thumbImageView.userInteractionEnabled = YES;
    [self.contentView addSubview:thumbImageView];
}

-(void) performSelected:(bool)selected
{
    if (selected)
    {
        UIImageView *deleteImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"delete"]];
        deleteImageView.frame = CGRectMake(self.contentView.frame.size.width - 35, 3, 32, 32);
        deleteImageView.tag = 123;
        [self.contentView addSubview:deleteImageView];
    }
    else
    {
        UIView *v = [self.contentView viewWithTag:123];
        v.hidden = YES;
        [self.contentView bringSubviewToFront:v];
        [v removeFromSuperview];
    }
}

Any suggestion would be appreciated. thanks.

like image 290
LUI Avatar asked Apr 29 '14 04:04

LUI


1 Answers

As @highlycaffeinated I ran into this problem to. However calling invalidateLayout didn't work for me.

However assigning the delegate AFTER the datasource worked.

I changed:

self.collectionView.delegate = self;
self.collectionView.dataSource = self;

with:

self.collectionView.dataSource = self;
self.collectionView.delegate = self;
like image 146
dynamokaj Avatar answered Sep 30 '22 05:09

dynamokaj