UITableView ne touche pas à un seul identificateur de mouvement

J'ai un UIView avec une vue UITextField, UIButton et UITable. Le champ de text et le button compromettent une barre de search et les résultats sont ensuite chargés dans la vue de la table.

Je voudrais faire en sorte que le keyboard soit rejeté. Si l'user appuie sur quelque chose lors de la modification du champ de text. Ma stratégie serait d'append un reconnaisseur de geste à l'UIView, mais alors le reconnaissance des gestes semble intercepter toutes les touches de la vue de la table et vous | tableView: didSelectCellAtIndexPath: | ne s'appelle jamais. Ce qui est intéressant (pour moi au less), c'est que l'UIButton est encore utilisable lorsque l'user édite le champ même si l'UITableView ne l'est pas.

J'ai essayé d'implémenter | gestureRecognizer :: shouldRecognizeSimultaneouslyWithGestureRecognizer: | pour toujours revenir oui, mais cela n'aide pas. J'ai aussi essayé le réglage

singleTapRecognizer.cancelsTouchesInView = NO; 

ce qui n'aide pas non plus.

Je suis heureux avec l'idée d'append et de supprimer la reconnaissance de gestes lorsque le champ de text appelle | textFieldDidBeginEditing: | et | textFieldDidFinishEditing: |, bien que cela semble désordonné et qu'il faut encore deux pressions pour toucher une cellule lorsque vous modifiez le champ de text (un pour fermer le keyboard et supprimer le module de reconnaissance, et un pour toucher la cellule).

Y a-t-il un meilleur moyen?

Code pertinent ci-dessous:

 - (void)loadView { [super loadView]; self.scrollView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.scrollView.backgroundColor = [FDEColors viewBackgroundColor]; self.view = self.scrollView; self.searchField = [[UITextField alloc] initWithFrame:CGRectZero]; self.searchField.placeholder = @"What are you looking for?"; self.searchField.backgroundColor = [FDEColors textFieldBackgroundColor]; self.searchField.clipsToBounds = YES; self.searchField.layer.borderColor = [[FDEColors buttonColor] CGColor]; self.searchField.layer.borderWidth = 1.f; self.searchField.returnKeyType = UIReturnKeySearch; self.searchField.delegate = self; [self.view addSubview:self.searchField]; self.searchButton = [[UIButton alloc] initWithFrame:CGRectZero]; self.searchButton.backgroundColor = [FDEColors buttonColor]; [self.searchButton setTitle:@"Search" forState:UIControlStateNormal]; [self.searchButton addTarget:self action:@selector(searchPressed:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.searchButton]; self.resultsTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; self.resultsTableView.delegate = self; self.resultsTableView.dataSource = self; self.resultsTableView.backgroundColor = [FDEColors viewBackgroundColor]; [self.resultsTableView setSeparatorInset:UIEdgeInsetsZero]; self.resultsTableView.layoutMargins = UIEdgeInsetsZero; [self.resultsTableView registerClass:[FDESearchResultsCell class] forCellReuseIdentifier:[FDESearchResultsCell reuseIdentifier]]; [self.view addSubview:self.resultsTableView]; self.singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; [self.view addGestureRecognizer:self.singleTapRecognizer]; } - (void)dismissKeyboard { [[self view] endEditing:YES]; } 

Essayez d'implémenter la méthode de délégation de l'outil de reconnaissance de gestes:

 - (BOOL) gestureRecognizer:ShouldReceiveRouch: 

Dans cette méthode, vérifiez l'location du toucher. Si c'est dans la vue de table, renvoyez non, ainsi la vue de table peut recevoir le contact. Sinon, renvoyez YES et laissez le module de reconnaissance gérer le contact.

Edit: Comme pour le button recevant le toucher malgré l'existence du reconnaisseur, à partir de iOS6, Apple a décidé d'accorder la priorité aux buttons et à d'autres controls lorsqu'il s'agit de reconnaître des gestes. Cela ne s'applique qu'aux gestes antagonistes, dans votre cas, un seul robinet. Si par exemple vous aviez aussi un système de reconnaissance de pan, le système de reconnaissance aurait la priorité, pas le button.

Édition 2:

Un exemple de mise en œuvre de la méthode mentionnée ci-dessus:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Determine if the touch is inside the custom subview if ([touch view] == self.yourTableView){ // If it is, prevent all of the delegate's gesture recognizers // from receiving the touch return NO; } return YES; 

}