devenirPremierRépondant :faites défiler automatiquement jusqu'à l'UIControl qui devient le premier intervenant
-
15-11-2019 - |
Question
j'ai un groupe UITableViewController
avec une section et plusieurs lignes.Chaque cell
se compose de deux éléments :un UILabel
avec une description et un UITextField
pour une entrée.Une forme, je dirais.
En bas se trouve un bouton "Suivant" pour passer à la vue suivante.Mais avant cela, je valide le UITextField
:si l'utilisateur n'a pas rempli de champ, ce champ doit avoir le focus, afin que l'utilisateur voie qu'il doit saisir quelque chose.J'ai essayé avec ça :
[inputField becomeFirstResponder];
Rappelez-vous, le bouton sur lequel j'ai appuyé est en bas de mon point de vue et imaginez que le UITextField
est au sommet.Dans cette situation, le champ n'est pas mis au point car il est trop éloigné.Maintenant, lorsque je fais défiler lentement vers le haut et que le champ devient visible, le champ devient le premier intervenant et obtient le curseur :-) Conclusion :Le becomeFirstResponder
a fonctionné, mais ne fait pas exactement ce que je voulais.Je ne veux pas faire défiler vers le haut avec mon doigt, le champ doit être mis au point et visible automatiquement.
Existe-t-il un moyen de « passer » directement à mon domaine ?Utiliser une alternative à becomeFirstResponder
?Faire défiler automatiquement jusqu'à mon champ ?
Merci pour votre aide!
La solution
Si vous connaissez l'index de la cellule avec le UITextField que vous souhaitez modifier, utilisez
NSIndexPath* indexPath = [[NSIndexPath indexPathWithIndex:your_section_index] indexPathByAddingIndex:your_cell_index];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]
avant d'appeler becomeFirstResponder
.
Si la cellule n'est pas affichée à l'écran, devenirFirstResponder peut échouer pour certaines versions d'iOS.De plus, certaines versions effectueront un défilement supplémentaire sur la tableview dans certaines situations (par ex.si le code d'Apple détermine que le répondeur serait toujours hors de l'écran sans plus de défilement).Pour contourner ces problèmes, vous devrez peut-être appeler le premier intervenant une fois l'animation de défilement terminée.
Autres conseils
J'aurais le même problème. cela est dû au fait que l'UIAnimation se produit simultanément pour les deux tâches.Ainsi, alors que l'UIAnimation pour scrollToRowAtIndexPath ignore le comeFirstResponder .
La solution pourrait être désactivez l'effet d'animation OU sinon en utilisant le performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:1.0f];
.