2017-07-11 2 views
0

Je tente de créer par programme un bouton dans chaque cellule d'un UICollectionView; cependant, seul le premier bouton est visible. J'ai essayé d'ajouter des instructions d'impression pour voir quelles sous-vues mes cellules ont et le bouton est présent mais il n'apparaît pas sur l'écran.Plusieurs boutons n'apparaissent pas dans UICollectionViewCell

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) 
    // Configure the cell 

    let button = UIButton(frame: cell.frame) 
    button.addTarget(self, action: #selector(cellClicked), for: UIControlEvents.touchUpInside) 
    button.backgroundColor = UIColor.red 
    button.tag = indexPath.row 
    cell.addSubview(button) 

    print(cell.subviews) 

    return cell 
} 

En outre, j'ai ajouté une déclaration d'impression en cliquant sur les boutons et que le premier bouton apparaît et affiche 0.

@IBAction func cellClicked(sender: UIButton) { 
    print(sender.tag) 
} 

Here is a screenshot of the collection view, there should be two buttons in the picture but only one appears

Toute aide est très appréciée.

+0

Combien d'enregistrements de données avez-vous dans votre source de données 'collectionView'? – Lawliet

+0

J'ai deux enregistrements de données dans mon cas de test actuel – Armand

Répondre

0

Il est très mauvais d'ajouter un bouton dans la source de données, car lorsque la cellule est réutilisée, de nouveaux boutons sont créés. Si vous utilisez Interface Builder, veuillez ajouter le bouton directement. Et vous pouvez ajuster leurs propriétés. Vous pouvez également définir une cellule personnalisée, et simplement CTRL-Faites glisser une sortie. Ou gérer la sélection dans le délégué de la vue de collection.

optional public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

Une autre solution est d'ajouter le bouton dans la cellule de awakeFromNib(), ce sera appelée une seule fois.

+0

J'ai ajouté le code dans awakeFormNib() de la cellule comme vous l'avez suggéré et cela a fonctionné. Je vous remercie! – Armand