Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView reload data Issue

I have a problem with data reloading using UICollectionView. I have this array on the viewDidLoad to fill the UICollectionView.

array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
[array addObject:@"2"];
[array addObject:@"3"];
[array addObject:@"4"];
[array addObject:@"5"];
[array addObject:@"6"];

and the method:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"Cell";
    //cell = [[UICollectionViewCell alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    myCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 100, 20)];
    [titleLabel setText:[array objectAtIndex:indexPath.row]];
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.backgroundColor = [UIColor clearColor];
    [cell addSubview:titleLabel];

    return cell;
}

I tap the UIButton and data is reloaded:

[myCollectionView reloadData];

Here how the data looks like before and after the reload: Before

After

like image 229
ThePunisher Avatar asked Dec 09 '22 15:12

ThePunisher


2 Answers

You add a new label each time you tap the reload button. You should add the label once and change the label text according.

Here a simple example.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    MyCell *cell = (MyCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"
                                                                               forIndexPath:indexPath];
    [cell setMyTextLabel:indexPath.row];
    return cell;
}

where MyCell will contains a UILabel and a property to modify its text.

I really suggest to take a look at Fun with UICollectionView code by @Ben Scheirman.

Hope that helps.

P.S. Rename myCell to MyCell. A class should start with an uppercase letter.

like image 51
Lorenzo B Avatar answered Dec 29 '22 13:12

Lorenzo B


You are adding your label when you tap reload button. In that case you are adding label again and again...

So there are three solutions:

  • Make your cell reusable
  • Remove your cell from superview in reload method.
  • You can check if label's text length is not equal to zero. In that case no need to add that label and change text.
like image 45
Dharmbir Singh Avatar answered Dec 29 '22 13:12

Dharmbir Singh