J'ai une vue de table et chaque cellule contient un bouton. Cela fonctionne à peu près toutes les versions iOS mais 7. Je ne sais pas ce qui se passe. La cellule est construite dans un fichier xib.
Quelqu'un pourrait-il me donner quelques suggestions? Merci d'avance.
Ce qui a fonctionné pour moi, c'est ceci:
contentView.userInteractionEnabled = NO;
appelé après le chargement de ma cellule personnalisée à partir de nib. Il semble que cette vue de contenu soit créée et définie comme une vue enfant de niveau supérieur après avoir créé des vues définies dans le fichier nib.
Appeler [cell bringSubviewToFront:button]
après avoir chargé la cellule à partir de nib a résolu cela pour moi.
J'ai également eu du mal avec ce problème et j'ai fait beaucoup de recherches sur les différentes réponses sur stackoverflow et internet, la solution est différente selon la source du problème. Dans la plupart des cas, vous devez effectuer les opérations suivantes avec l'élément qui est censé prendre des mesures utilisateur (appuyez/cliquez sur etc.):myButton.userInteractionEnabled = YES;
En particulier pour UILabel/UIImageView, par défaut, l'indicateur userInteractionEnabled
est NO
.
Si vous chargez la vue à partir d'un fichier xib, vous devez vous assurer, à partir de la vue de cellule personnalisée, de la vue de contenu et de l'élément que vous souhaitez que l'action de l'utilisateur soit activée, que la case à cocher soit cochée:
Dans l'exemple ci-dessus, l'élément DeviceViewCell, Content View et Button a tous la case à cocher "ser Interaction Enabled" cochée .
Si la cellule personnalisée est implémentée en tant que sous-classe de UITableViewCell et que la vue de cellule personnalisée est chargée dynamiquement à partir d'un autre fichier xib, vous DEVEZ FAIRE encore une chose qui prête à confusion pour la plupart des gens, mais je vais vous expliquer pourquoi plus tard:
Dans la méthode d'initialisation de la cellule personnalisée, vous devez effectuer les opérations suivantes:self.contentView.userInteractionEnabled = NO
où self
est la sous-classe de UITableViewCell que vous avez créée. Encore une fois, SI la cellule personnalisée est implémentée en tant que sous-classe de UITableViewCell et que la vue de cellule personnalisée est chargée DYNAMIQUEMENT à partir d'un autre fichier xib, vous devez effectuer les opérations ci-dessus. Voici l'explication:
self.contentView
ce n'est pas la même chose Content View
vous voyez dans Interface Builder, il est créé par le système comme default content view
qui se trouve au-dessus de toutes les autres vues/éléments de votre vue de cellule personnalisée et qui masque le reste des vues dans la hiérarchie des vues. Par conséquent, vous devrez désactiver l'interaction utilisateur pour elle avant que les éléments d'interface utilisateur dans la vue de cellule personnalisée puissent recevoir des événements d'interaction utilisateur. J'espère que cela t'aides. Si vous avez une meilleure explication, j'aimerais l'entendre :-). C'est encore mon observation et il pourrait y avoir d'autres raisons. La discussion est la bienvenue!
Le problème est que votre plume ne contient pas de contentView, comme requis depuis le SDK iOS 8 (j'écris par expérience, je n'ai pas de source viable, désolé).
Lorsque vous ajoutez un UITableViewController
à un storyboard, un UITableViewCell est automatiquement ajouté à son UITableView
. Si vous jetez un œil à ce UITableView
, vous verrez un contentView
dedans.
Ainsi, lorsque vous sous-classez un UITableViewCell
et le créez avec un .xib, vous devrez cliquez et faites glisser un UITableViewCell
vers le xib au lieu du UIView
par défaut. N'oubliez pas ensuite de définir la classe File Owner et la classe UITableViewCell
dans votre sous-classe.
J'ai rencontré le même problème. Il s'avère que j'avais créé un objet UIView dans IB, puis défini sa classe sur une sous-classe de UITableViewCell.
Étant donné que l'objet que j'ai créé à l'origine dans IB était un UIView, le contentView UITableViewCell n'a pas été ajouté avant l'exécution, qui se trouvait au-dessus de mes boutons UIB les rendant non sélectionnables.
De toute évidence, il existe un certain nombre de choses qui peuvent mal tourner et certains correctifs fonctionnent sur certaines versions d'iOS et pas sur d'autres.
Mon problème était que j'avais un UIButton qui n'était pas une sous-vue immédiate de cell.contentView (c'est-à-dire que c'était une sous-vue d'une sous-vue). J'ai dû ajouter mon bouton directement à cell.contentView pour qu'il soit utilisable. (iOS v8 +)
La solution à ce problème est;
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
Cela fonctionne pour moi.
J'ai eu le même problème. La raison est
self.contentView.Frame.size.height
est toujours 44.
Il est suggéré de définir votre self.contentView.Frame
à self.frame
à la méthode d'écrasement - (void)layoutSubviews
le problème sera résolu
Dans mon cas, tout ce avec quoi j'aimerais que l'utilisateur interagisse est en dehors de ContentView. Je ne souhaite pas non plus que la cellule soit mise en surbrillance lorsqu'elle est sélectionnée.
Toutes les étiquettes (nom, catégories, etc.) sont immédiatement sous "Affichage du contenu". Le WebsiteButton n'est pas sous "Affichage du contenu", mais il est sous "Cellule de tableau de répertoire local".
Dans ma méthode tableViewController tableView: cellForRowAtIndexPath: j'ai le code suivant: cell.contentView.userInteractionEnabled = NO;
C'est tout et l'utilisateur peut interagir avec le bouton. Je n'utilise PAS [cell bringSubviewToFront: cell.websiteButton];
Comme d'autres l'ont souligné, ajoutez toujours des sous-vues à la vue du contenu de la cellule. Si vous avez remplacé la méthode layoutSubviews
, assurez-vous d'appeler la super implémentation. Oublier d'appeler la super implémentation donne des résultats inattendus.
L'erreur la plus évidente que je n'ai pas vue décrite ici est que vous DEVEZ avoir un selectedBackgroundImage pour qu'un UIButton soit différent lorsqu'il est sélectionné. Ce ne sont pas, disons, UITableViewCells.
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
J'ai eu le même problème avec un UIButton dans une cellule prototype de mon storyboard. Je l'ai résolu en cochant "Interaction utilisateur activée" sur la cellule prototype. Cela a fonctionné sur iOS 7.1.
J'ai rencontré un problème similaire sur UITableViewCell et UICollectionViewCell. Quelques étapes à suivre:
En bref, les cellules TableView/CollectionView ne peuvent pas prendre de sous-vues exploitables (UIButton, UISegmentedControl) qui sont activées pour la mise en page automatique. Si vous en avez besoin, désactivez les dispositions automatiques et fournissez des cadres (ou) placez-les dans une vue conteneur (la présentation conteneur doit avoir la disposition automatique désactivée) et ajoutez les vues exploitables (avec la disposition automatique) en tant que sous-vues à la vue conteneur .
Dans mon cas, je dois également vérifier la "User Interaction Enabled" pour la cellule elle-même (pas seulement le contentView). Mais comme indiqué dans d'autres réponses, il pourrait y avoir plusieurs raisons pour lesquelles cela se produit, donc je suis sûr que cela ne fonctionnera pas pour tous les cas.
Aucune de ces réponses n'a fonctionné pour moi.
La seule façon dont j'ai pu résoudre ce problème était de définir la sélection des cellules du tableau de unique à aucune. Après cela, j'ai pu recevoir des rappels de bouton.
Lorsque vous utilisez Interface Builder (Storyboard), assurez-vous de vérifier le User Interaction Enabled
case à cocher du Content View
J'avais une vue transparente sur cette cellule qui implémentait certaines fonctionnalités internes et gérait les contacts avec soi-même.
J'ai tout vérifié mais j'ai fait une erreur idiote dans le storyboard, la vue d'ensemble de mon bouton était en dessous d'une autre vue. donc le toucher ne passait pas à mon bouton.
Assez câblé, la solution pour moi est d'aller dans le storyboard, de sélectionner la vue de contenu dans la cellule et de vérifier "userInteractionEnabled" ... sinon même si vous avez activé userInteraction au bouton ou dans la cellule, contentview bloquera toujours l'action .
D'accord, j'ai trouvé une solution à ce problème, mais cela semble être un énorme hack; cependant, c'est tout ce que j'ai pu trouver (rien d'autre ici n'a fonctionné pour moi).
Sur le dessus de mon button
j'ai ajouté un UITextField qui délègue à la cellule de vue de table en question. Cette instance de tableViewCell implémente -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
et renvoie NO
.