web-dev-qa-db-fra.com

Le bouton dans UITableViewCell ne répond pas sous iOS 7

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.

50
Xavier

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.

69
b005t3r

Appeler [cell bringSubviewToFront:button] après avoir chargé la cellule à partir de nib a résolu cela pour moi.

32
yonix

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:
enter image description here

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

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!

27
us_david

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.

6
dulgan

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.

4
Collin

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 +)

4
mikejonesguy

La solution à ce problème est;

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
cell.bringSubviewToFront(cell.YOUR_UIView)    
}

Cela fonctionne pour moi.

4

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

3
Snail

My Cell's outline

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];

3
Adrian Silveanu

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.

2
diatche

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)
2
AppreciateIt

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.

2
Mike Taverne

J'ai rencontré un problème similaire sur UITableViewCell et UICollectionViewCell. Quelques étapes à suivre:

  1. Ajoutez toujours des sous-vues à la vue de contenu de la vue de cellule et NON à la vue de cellule elle-même
  2. Si vous ajoutez une vue de conteneur (qui contient votre bouton), désactivez la mise en page automatique de la vue de conteneur et activez la mise en page automatique uniquement pour le contenu à l'intérieur de la vue de conteneur. Utilisez la disposition du cadre pour la vue du conteneur.

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 .

1
Visu

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.

enter image description here

1
Jove Kuang

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.

0
Isaac Paul

Lorsque vous utilisez Interface Builder (Storyboard), assurez-vous de vérifier le User Interaction Enabled case à cocher du Content View

0
gpichler

J'avais une vue transparente sur cette cellule qui implémentait certaines fonctionnalités internes et gérait les contacts avec soi-même.

0
Nikolay Shubenkov

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.

0

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 .

0
Summer

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.

0
dave