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?
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.
Si cela ne ressemble pas à cela, il est probable que les événements tactiles seront mal interprétés.
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];
}
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");
}
Je viens de résoudre avec l'ajout
[self bringSubviewToFront:myButton];
en awakeFromNib
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:
La définition de la «Taille automatique des sous-vues» de la cellule dans Interface Builder sur YES a résolu mon problème!
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.
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.