Question

J'écris une application iOS avec une vue sous forme de tableau dans un onglet. Dans mon UITableViewController , j'ai implémenté -tableView: didSelectRowAtIndexPath: , mais lorsque je sélectionne une ligne au moment de l'exécution, la méthode n'est pas appelée. La vue sous forme de table est en train d'être peuplée, donc je sais que d'autres méthodes tableView de mon contrôleur sont appelées.

Quelqu'un at-il une idée de ce que j'ai pu foiré pour y arriver?

Était-ce utile?

La solution

Il semble que la classe ne soit peut-être pas le UITableViewDelegate de cette vue tabulaire, bien que UITableViewController soit censé le définir automatiquement.

Avez-vous une chance de réinitialiser le délégué dans une autre classe?

Autres conseils

Juste au cas où quelqu'un ferait la même erreur stupide que moi:

Vérifiez si le nom de la méthode que vous attendez d'être didSelect peut être obtenu accidentellement par didDeselect . Il m'a fallu environ deux heures pour le découvrir ...

Une autre chose qui pourrait entraîner le problème est le type de sélection non sélectionné:

Type de sélection UITableView

Devrait être Sélection unique pour une sélection normale, si ne pas devait être Aucune sélection .

Une autre possibilité est qu’un UITapGestureRecognizer consomme les événements, comme c’était le cas ici: https://stackoverflow.com/a / 9248827/214070

Je ne soupçonnais pas cette cause, car les cellules du tableau seraient toujours surlignées en bleu comme si les robinets passaient.

Toutes les bonnes réponses, mais il en reste une à rechercher ...

(particulièrement lors de la création d'un UITableView par programme)

Assurez-vous que tableView peut répondre à la sélection en définissant [tableView setAllowsSelection: YES]; ou en supprimant toute ligne qui le définit sur NO .

Si le problème survient avec UITapGestureRecognizer , vous pouvez résoudre ce problème:

  • dans le storyboard:

entrer la description de l'image ici

dans le code avec Objective-C :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

dans le code avec Swift :

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

J'ai rencontré deux problèmes dans cette situation.

  1. Vous avez peut-être oublié d'implémenter le protocole UITableViewDelegate ou il n'y a pas de sortie de délégation entre votre classe et votre vue tableau.

  2. Vous avez peut-être un premier répondant dans votre ligne, qui enlève vos clics. Dites un UIButton ou quelque chose de similaire.

J'ai eu le même problème. Et c'était difficile à trouver. Mais quelque part dans mon code était-ce:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Il doit s'agir de return indexPath , sinon -tableView: didSelectRowAtIndexPath: n'est pas appelé.

Si vous avez ajouté un gestureRecognizer au-dessus de UITableView, didSelectRowAtIndexPath ne sera pas appelé.

Vous devez donc utiliser la méthode de délégation gestureRecognizer pour éviter les contacts dans une vue particulière.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

J'ai rencontré un problème où, après des mois sans regarder mon code, j'avais oublié que j'avais implémenté la méthode suivante en raison de certaines exigences inutiles

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Il devrait renvoyer YES pour une ligne afin de le sélectionner.

VOUS DEVEZ sélectionner ces options

 entrer la description de l'image ici

mais si vous souhaitez que UITableView ne soit pas mis en surbrillance en cliquant, vous devez modifier les propriétés UITableViewCell .

Choisissez l'option Aucune pour la sélection, comme ci-dessous

 entrer la description de l'image ici

J'avais placé un UITapGestureRecognizer sur ma table pour ignorer le clavier, ce qui empêchait didSelectRowAtIndexPath: d'être appelé. J'espère que ça aidera quelqu'un.

Si vous avez le même problème que moi: Apparemment, cette méthode ne sera pas appelée si votre tableView est en mode édition. Vous devez définir allowSelectionDuringEditing sur true.

Via cette question: Lors de la modification, `UITableView` n'appelle pas didSelectRowAtIndexPath ??

J'ai eu le même problème,

La raison était l'utilisation de UITapGestureRecognizer . Je voulais que le clavier disparaisse lorsque j'ai tapé ailleurs. J'ai réalisé que cela annulait toutes les actions tapées, c'est pourquoi la fonction didSelectRowAtIndexPath n'a pas été appelée.

Lorsque je commente les lignes liées à UITapGestureRecognizer , cela fonctionne. De plus, vous pouvez vérifier dans la fonction de sélecteur UITapGestureRecognizer si le taraudé est UITableViewCell ou non.

Pour Xcode 6.4, Swift 1.2. La sélection " tag " avait été changé dans IB. Je ne sais pas comment et pourquoi. Définissez-le sur "Sélection unique". rendu mes cellules de vue de table sélectionnable à nouveau. entrer la description de l'image ici

Dans mon cas, didSelctRowAtIndexPath n'appelle pas parce que j'ai sélectionné aucune dans la propriété Selection de tableView, définie sur sélection unique . résolu mon problème

 entrez la description de l'image ici

Même si une autre réponse a été acceptée, je vais ajouter un autre problème possible et une solution pour les personnes qui observent ce problème:

Si le comptage automatique des références (ARC) est activé, vous pouvez constater que même après avoir affecté votre contrôleur en tant que délégué de la vue, les messages de la vue à destination du contrôleur ne sont pas reçus car ARC supprime le contrôleur. Apparemment, le pointeur délégué de UITableView ne compte pas comme une référence pour l'ARC. Si c'est la seule référence, le contrôleur sera libéré. Vous pouvez vérifier si cela se produit ou non en implémentant la méthode dealloc sur le contrôleur et en y définissant un point d'arrêt ou un appel NSLog.

La solution est de garder le contrôleur avec une référence forte quelque part ailleurs, jusqu'à ce que vous soyez sûr de ne plus en avoir besoin.

N'oubliez pas de définir la source de données et le délégué dans la méthode viewDidLoad comme suit:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Mon problème n'était aucun de ce qui précède. Et si boiteux. Mais je pensais que je la listerais ici au cas où cela aiderait quelqu'un

J'ai un tableViewController qui est ma "base". contrôleur puis je crée des sous-classes de ce contrôleur. J'écrivais tout mon code dans la routine tableView: didSelectRowAtIndexPath dans l'option "base". classe. Oubliant complètement que, par défaut, cette routine avait également été créée (même si aucun code ne faisait rien) dans toutes mes sous-classes. Ainsi, lorsque j'ai lancé mon application, la version sous-classe du code n'a pas fonctionné et m'a rendu triste. Alors bien sûr, une fois que j’ai retiré la routine des sous-classes, elle utilisait mt "base". routine de classe et je suis en affaires.

Je sais. Ne ris pas Mais peut-être que cela sauvera quelqu'un de l'heure que j'ai perdue ...

Donner mes 2 centimes à ce sujet.

J'avais une UITableViewCell personnalisée et il y avait un bouton couvrant toute la cellule. Ainsi, lorsque le contact a eu lieu, le bouton était sélectionné et non la cellule.

Supprimez le bouton ou, dans mon cas, je règle sur Interaction utilisateur activée sur false pour que la cellule soit celle sélectionnée.

Si vous lisez ceci, le problème ne sera toujours pas résolu.

J'ai une cellule personnalisée , dans laquelle la case à cocher " Interaction utilisateur activée" " était désactivé. Alors, je viens de l'allumer. Bonne chance.

Je viens d'avoir cela et comme cela m'est arrivé dans le passé, cela n'a pas fonctionné parce que je n'ai pas prêté attention à la saisie semi-automatique lorsque j'essaie d'ajouter la méthode et que je finis par implémenter tableView: didDeselectRowAtIndexPath : au lieu de tableView: didSelectRowAtIndexPath: .

Je sais que c’est vieux et que le problème a été résolu, mais il y avait un problème similaire. Je pensais que le problème venait de mon UITableViewCell personnalisé, mais la solution était complètement différente - je redémarre XCode :) et puis ça marche! presque comme Windows:)

Si votre vue de table est en mode d'édition (par exemple, [tableView setEditing: OUI animée: NO]; ), vous devez définir tableView.allowsSelectionDuringEditing = YES;

Assurez-vous que vous avez mis en œuvre tableView: didSelectRowAtIndexPath et non tableView: didDeSelectRowAtIndexPath

Cela m’a été obtenu à plus de quelques reprises !!

Une autre erreur que vous auriez pu commettre (comme je l’ai fait): si vous définissez une séparation dans la cellule, didSelectRowAtIndexPath n’est pas appelé. Vous devez plutôt définir vos suites sur le contrôleur de vue.

Aucune de ces réponses n'a fonctionné pour moi. Après environ une heure, j'ai découvert quelque chose de très insidieux:

J'ai une vue de tableau dans une cellule d'une autre vue de tableau. J'ai décidé de créer une vue englobante contenant notamment la vue de la table interne. J'ai appelé cette vue contentView et l'ai connectée à xib.

Il s'avère que UITableViewCell a déjà un contentView et en fait des choses bizarres. Le problème s'est résolu lorsque j'ai renommé la propriété mainContentView et que j'ai reconnecté la vue à cette propriété renommée.

Dans mon cas, je calcule de manière dynamique la hauteur du SuperView de TableView au moment du chargement. En raison d'une erreur de calcul, TableView était positionné en dehors du SuperView . TableView a été bien dessiné, mais toutes les interactions ont été désactivées (et didSelectRowAtIndexPath n'a jamais été appelé). Très difficile à détecter, car rien n'indique que le TableView ne soit pas "accessible".

Dans mon cas, la solution consistait à changer NON en OUI dans la fonction ci-dessous.

iOS 9 +

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Ok, mise à jour ici car je viens de rencontrer ce problème et mon problème était légèrement différent de celui trouvé ici.

J'ai regardé dans IB et j'ai constaté que mon délégué était défini sur WAS, mais il avait été défini de manière incorrecte sur VIEW au lieu de Propriétaire du fichier (cliquez avec le bouton droit sur la vue tabulaire pour voir où le délégué pointe vers.).

L'espoir qui aide quelqu'un

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top