web-dev-qa-db-fra.com

Obtention d'une action sur un bouton: cellule UICollectionView

J'ai créé une UICollectionViewCell par nib et ajouté un bouton à l'intérieur. Des fichiers .h et .m ont ajouté la classe aux nibs file's owner. Puis écrit une action de bouton dans le fichier .m connecté via la sortie.

La vue Collection remplit correctement, mais ne peut pas déclencher l'action Buton ..__ Je pense que le délégué de la cellule de collection est appelé.

Comment puis-je obtenir l'action du bouton?

22
Lithu T.V

J'ai eu ce problème aussi. Aucune sous-vue ne recevrait d'événements tactiles. Même si la solution de contournement de Scott K fonctionne, j’ai quand même pensé que quelque chose clochait. Alors, j’ai jeté un autre coup d’œil à ma pointe, et j’ai remarqué que la sous-vue originale avec laquelle je créais UICollectionViewCell était une UIView. Même si j'ai changé la classe en une sous-classe de UICollectionViewCell, XCode l'a toujours considérée comme une UIView et, par conséquent, les problèmes que vous voyez avec contentView ne capturent pas les événements tactiles.

Pour résoudre ce problème, j'ai refait le nib en veillant à faire glisser un objet UICollectionViewCell, puis en déplaçant toutes les sous-vues vers celui-ci. Ensuite, les événements tactiles ont commencé à fonctionner sur les sous-vues de ma cellule. 

Pourrait indiquer si votre nib est configurée en tant que UICollectionViewCell, regardez l'icône pour votre vue de haut niveau. 

enter image description here

Si cela ne ressemble pas à cela, il est probable que les événements tactiles seront mal interprétés.

89
haider

Lorsque vous créez une UICollectionViewCell via un nib, le contenu de la nib n'est pas ajouté à contentView de la cellule. Tout est ajouté directement à la UICollectionViewCell. Il ne semble pas y avoir de moyen de faire en sorte qu'Interface Builder reconnaisse la vue de niveau supérieur du nib en tant que UICollectionViewCell, de sorte que tout le contenu de "automatiquement" soit ajouté à contentView.

Comme l'a souligné sunkehappy, tout ce que vous souhaitez recevoir des événements tactiles doit être inséré dans le contentView. Il a déjà été créé pour vous. Le mieux que vous puissiez faire est donc de déplacer par programme votre UIButton dans contentView à awakeFromNib-time.

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}
11
Scott K.

Référence de la classe UICollectionViewCell

Pour configurer l'apparence de votre cellule, ajoutez les vues nécessaires à présenter le contenu de l’élément de données sous forme de vue secondaire à la vue dans le fichier propriété contentView. Ne pas ajouter directement des sous-vues à la cellule elle-même . La cellule gère plusieurs couches de contenu, dont la vue de contenu est un seul. En plus de la vue du contenu, la cellule en gère deux les vues d'arrière-plan qui affichent la cellule dans sa sélection et États non sélectionnés.

Vous pouvez ajouter votre bouton dans awakeFromNib comme ceci:

- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}

- (void)buttonClicked:(id)sender
{
    NSLog(@"button clicked");
}
6
sunkehappy

Je viens de résoudre avec l'ajout

[self bringSubviewToFront:myButton];

en awakeFromNib

2
kalafun

J'ai eu un problème similaire où les sous-vues de la partie inférieure de la cellule ne recevaient pas les événements tactiles, mais la partie supérieure fonctionnait bien. J'ai donc commencé à enquêter et j'ai obtenu les résultats suivants:

  • Le générateur d'interface ajoute les vues secondaires de la cellule que vous avez créées à la contentView de la cellule, même si le contentView lui-même n'est pas visible dans le générateur d'interface.
  • Mon code a développé les cellules pour les adapter à la taille du contenu, de sorte que la majorité des cellules de la vue Collection avaient une hauteur supérieure à celle du modèle dans Interface Builder.
  • Pour une raison quelconque, la propriété 'Autoresize subviews' de la cellule elle-même a été définie sur NO. Ceci a fait que contentView, le constructeur mystérieux et non visible dans le constructeur d'interface, a conservé la même taille que la cellule avait à l'origine dans le générateur d'interface. Ainsi, les sous-vues situées en dehors des limites de contentView ne recevaient pas de touches et ne répondaient pas.

La définition de la «Taille automatique des sous-vues» de la cellule dans Interface Builder sur YES a résolu mon problème!

1
Zoltán Lippai

Je me sens difficile à comprendre la réponse acceptée, je vais essayer de donner une réponse simple.

Dans UICollectionViewCell, il existe deux types.

  1. Voir la cellule de la collection 
  2. Collection Réutilisable Voir

J'ai utilisé la vue Collection Reusable View, dans la mesure où les actions des boutons ne fonctionnent pas.

Ensuite, conformément à la réponse acceptée, j’ai essayé d’utiliser la cellule Collection View, en ce sens que seules les actions de bouton fonctionnent. Utilisez le deuxième objet de l'image. Cela fonctionnera bien.

 enter image description here

0
R. Mohan