J'ai un UITableView
comme sous-vue de mon UIScrollVIew
, qui est la vue principale contrôlée par mon MainViewController
.
Dans MainViewController.h
@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>
// other stuff here...
@property (weak, nonatomic) IBOutlet UITableView *myTableView;
Dans MainViewController.m
@synthesize myTableView;
// other stuff here...
- (void)viewDidLoad {
myTableView.delegate = self;
myTableView.datasource = self;
}
// other stuff here...
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}
Je sais que didSelectRowAtIndexPath
n'est pas appelé car j'ai défini des points d'arrêt à la fois sur la méthode elle-même et sur la ligne de code qu'elle contient, et ni l'un ni l'autre n'est appelé. Je sais également que la source de données fonctionne correctement car j'ai d'autres fonctions qui modifient les cellules au moment de l'exécution et elles fonctionnent parfaitement bien. J'utilise le dernier Xcode avec iOS 5.0 défini comme cible de développement. J'ai cherché et cherché une réponse. Quelqu'un a des idées?
Edit: J'ai trouvé la réponse. J'avais un UITapGestureRecognizer
défini pour le superView de myTableView. Cela a annulé l'appel de sélection. Nous remercions tous ceux qui ont suggéré que ce pourrait être cela. Votre réponse a été supprimée avant que je puisse la marquer comme correcte.
Edit 2: Beaucoup de gens ont fait des commentaires à ce sujet, donc j'ai pensé que je le partagerais. Si vous rencontrez ce problème, définissez simplement myGestureRecognizer.cancelsTouchInView
à false
et tout devrait bien fonctionner.
J'ai trouvé la réponse. J'avais un ensemble UITapGestureRecognizer pour la superView de myTableView. Cela a annulé l'appel de sélection. Nous remercions tous ceux qui ont suggéré que ce pourrait être cela. Votre réponse a été supprimée avant que je puisse la marquer comme correcte.
Définissez la propriété cancelsTouchesInView
sur NO
sur le reconnaisseur de mouvements pour permettre à la vue de table d'intercepter l'événement.
Mis à jour pour Swift 3:
si vous utilisez UITapGestureRecognizer dans votre code: - # Swift utilisez les lignes de code ci-dessous:
extension YourViewController{
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
tap.cancelsTouchesInView = false
}
func dismissKeyboard() {
view.endEditing(true)
}
}
Comment appelé: - Dans ViewDidLoad ()
self.hideKeyboardWhenTappedAround()
Votre problème est la sensibilité à la casse. Votre code:
- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
devrait être
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
C'est peut-être une faute de frappe après tout. Vérifiez que votre fonction n'est pas didDeselectRowAtIndexPath:
(de sélectionner au lieu de sélectionner).
Avez-vous défini une variable d'instance pour tableview avec le même nom. Sinon, cela pourrait être le problème.
_myTableView.delegate = self;
_myTableView.datasource = self;
Ou-
self.myTableView.delegate = self;
self.myTableView.datasource = self;
Ma solution est:
set cancelsTouchesInView
To No
de n'importe quel tapGesture
J'ai trouvé dans ma cellule personnalisée, userInteractionEnable
est défini sur NO
, supprimez simplement userInteractionEnable = No
et problème résolu.
Annuler les autres vues vues sauf celle requise.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
if (touch.view == your view) {
return YES;
}
return NO;
}
Désolé, je n'ai pas assez de points pour ajouter des commentaires - la réponse de Garret est excellente mais j'ajouterais:
Vous pouvez toujours avoir votre reconnaissance de gestes, mais vous devrez définir "Annule les touches en vue" sur NON - puis les gestes seront transmis à la vue et votre UITableView fonctionnera correctement.
Après avoir essayé beaucoup, beaucoup d'approches, cela semble être la bonne façon de faire les choses: un reconnaisseur de geste tactile avec `` annuler les touches en vue '', c'est comme avoir un calque invisible au-dessus de tout ce qui saisit tous les événements et les achemine vers le contrôleur de vue (le proxy). Le contrôleur de vue examine ensuite le geste pour voir s'il a une liaison d'action (boutons, etc.) et acheminera ceux-ci et tout ce qui restera ira simplement au gestionnaire de gestes. Lorsque vous utilisez un UITableView, il s'attend à recevoir le robinet, mais le contrôleur de vue le coupe lorsque vous avez "Annule les touches en vue".
Mon cas est étrange. Ma tableView a 2 sections. Les cellules de la 1ère section fonctionnent bien sur tableView:didSelectRowAt:
, mais les cellules de la 2e section ne déclenchent pas didSelectRowAt:
.
Le problème ci-dessus se produit à iPhone 4s, iOS 9.3
. Mais en iPhone 5s, iOS 10.3
, il n'y a aucun problème, ces cellules fonctionnent bien. Il semble que iOS 9
bugs concernant UITableView
.
Après de nombreux tests, j'ai découvert qu'un code de ligne produit ce bogue.
tableView.estimatedSectionHeaderHeight = 60.0
Parce que la 2e section n'a pas de vue d'en-tête. Je supprime cette ligne et tout fonctionne bien.
J'avais ce problème depuis un moment, et je n'ai vu aucune référence à cela ici, donc pour référence, une autre raison pourrait être que:
tableView.editing = YES;
mais
tableView.allowsSelectionDuringEditing = NO;
Selon la documentation pour
- tableView:didSelectRowAtIndexPath:
Cette méthode n'est pas appelée lorsque la propriété d'édition de la table est définie sur OUI (c'est-à-dire que la vue de table est en mode édition). Voir "Gestion des sélections" dans le Guide de programmation de la vue tabulaire pour iOS pour plus d'informations (et des exemples de code) liés à cette méthode.
J'ai eu une défaillance intermittente de didSelectRowAtIndexPath: être appelé sur ma presse cellulaire personnalisée.
J'ai découvert que si j'arrêtais d'appeler [tableView reloadData] très souvent (10 Hz) et que je le modifiais pour mettre à jour toutes les 2 secondes, presque chaque pression appelait avec succès didSelectRowAtIndexPath:
Il semble que le rechargement de la vue bloque les presses.
Une cellule peut être sélectionnée par l'utilisateur (en tapant sur la ligne), en appelant "tableView.selectRowAtIndexPath (..)" ou "cell.setSelected (true, ...).
Si la cellule est sélectionnée en appelant "cell.setSelected (true)", l'utilisateur ne peut plus désélectionner la cellule.
Si la cellule est sélectionnée en appelant "tableView.selectRowAtIndexPath ()", l'utilisateur peut désélectionner la cellule comme prévu.