Adding a UIButton to a UICollectionView cell programmatically

objective-c, uicollectionview, uicollectionviewcell, uiviewcontroller

Solution

Add your button as a subview of `cell.contentView`. Also, don't create the button every time `collectionView:cellForItemAtIndexPath:` is called. You might be reusing an existing cell that already has a button. Better to add the button in your custom cell's `init` method instead. Then just hide the button when you don't need it.

Problem

I have a UIViewController with a UICollectionView created inside it programmatically. I want to add a button to the cell: viewDidLoad: ``` UICollectionViewLayout *layout = [[UICollectionViewFlowLayout alloc]init]; _collectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout]; [_collectionView setDataSource:self]; [_collectionView setDelegate:self]; [_collectionView registerClass:[EMCell class] forCellWithReuseIdentifier:@"Cell"]; [self.view addSubview:_collectionView]; ``` And then: ``` - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ EMCell *cell = (EMCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; cell.backgroundColor = [UIColor greenColor]; UIButton *button = (UIButton *)[cell viewWithTag:200]; [button setFrame:CGRectMake(10, 10, 50, 60)]; [button setTitle:@"Button" forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [cell addSubview:button]; return cell; } ``` What am I doing wrong?

Original source