UITableView reloadData automatiquement les appels resignFirstResponder
J'ai cette UITableView personnalisée avec des cellules qui ne peut obtenir que des valeurs prédéfinies, donc j'utilise un UIPickerView que leur inputView. Tout est drôlement bon jusqu'à ce que j'ai modifier un champ et le besoin de montrer sa valeur de mise à jour.
Afin de rendre les choses plus claires et plus faciles à gérer, j'ai fait les délégués et les sources de données dans des classes séparées, et utiliser les notifications pour les faire interagir avec le tableView. Ainsi, lorsqu'une valeur a été choisie à partir de la UIPickerView, la tableView de la source de données est notifié, et à son tour, informe le principal ViewController qui contient une référence à la tableView. À partir de là, j'appelle
[_tableView reloadData];
et tout semble fonctionner, sauf que le UIPickerView disparaît, je pense que parce que les cellules sont régénérées et quelque resignFirstResponder est appelé, ou quelque chose comme ça.
Est-il un autre moyen de faire de la tableView la mise à jour de ses valeurs sans avoir à mettre en œuvre une méthode personnalisée quelque part que le fait, ce qui serait assez moche?
- Avez-vous essayé de ne pas recharger toute la vue de la table, seulement recharger l'effet de ligne? essayez cette méthode: -reloadRowsAtIndexPaths:withRowAnimation:
- Resings? hehe Oh la différence de permuter deux lettres de fait. 🙂
- Il n'a pas l'air simple, vous devrez peut-être fournir des informations plus détaillées
- Merci pour l'astuce, je vais essayer ça. @Richard LOL merci, corrigé 🙂
- Malheureusement, cette méthode entraîne le même comportement (bien qu'il ne recharge la choisi la cellule). Merci quand même, je vais essayer de le faire manuellement.
- Continue avec @cxa de la ligne de pensée: ne pas oublier la
reloadSections:withRowAnimation:
méthode surUITableView
. En utilisant cela a fonctionné pour moi. - Séquence
[tableView beginUpdates]
,[tableView endUpdates]
a fonctionné pour moi (iOS7)
Vous devez vous connecter pour publier un commentaire.
Ce livre se lit comme comportement attendu - le sélecteur appartient à un particulier de cellule, la cellule devient reloaded et n'est pas le premier intervenant plus. Je deviner avait pour sélectionner un élément spécifique de toute façon pour le sélecteur à apparaître, à savoir le premier intervenant.
Il faut donc les faire devenir secouriste à nouveau après un rechargement ou de mise à jour de la cellule spécifique directement.
ajoutant:
après votre:
a fait le tour
.default
ànumbersAndPunctuation
et sélectionnez n'importe quelle touche puis clavier s'affiche avec .default
type. Toute solution pour cela ???????J'ai rencontré le même problème, aucune des réponses ci-dessus a parfaitement fonctionné (je vois le clavier rebondir de haut en bas, etc.).
Suivant cette SORTE de post j'ai résolu le problème en appelant
cela a fonctionné pour moi, les lignes de la table obtenir des mises à jour et même à agrandir/rétrécir (si vous modifiez les lignes de la hauteur de manière dynamique) avec une belle animation, tous sans démissionner de premiers répondants ou même de commencer le clavier rejeter.
Ce ne sera pas défiler votre vue de la table pour s'adapter à tous élargi ligne, donc j'ai mis de l'extrait de code ci-dessus dans la méthode dédiée, f.e.:
J'ai résolu ce problème en sous-classement UITextView, en remplaçant -(BOOL)resignFirstResponder et par l'ajout d'un BOOL canResign. cette variable est définie avant de recharger les données, et retirés peu de temps après.
Vous pouvez suivre cette approche, pas la meilleure, mais elle fonctionne:
_tmpTextField
correctement. Je suis juste d'en faire un avec[[UITextInput alloc] init]
, puis de le définir comme le premier intervenant. Étant donné que je suis dans un UITableViewController exemple, je ne vois pas d'autre endroit pour le mettre. De l'aide?delayInSeconds
à 0,1, mais si elle de 0,001 ça marche!!!. Peut-être, il provoque des problèmes de performance... je ne sais pas.J'ai mis mon UISearchBar dans sa propre section dans une UITableView. Lors d'un tir hors de la recherche, j'ai veillé à seulement actualiser les articles qui ne contiennent pas la barre de recherche.
Champ texte personnalisé est dérivé de UITextField.
.h
.m
Assurez-vous que votre champ texte personnalisé est pas recréé sur la vue de la table de rechargement.
Si vous êtes confrontés à ce problème avec une barre de recherche, la suite l'a fait pour moi dans iOS 6:
Comme mentionné par @Eiko, cela fonctionne pour moi!
Mise à jour de la cellule dans UIPickerViewDelegate de
pickerView:didSelectRow:inComponent:
méthode:Solution Swift:
que nous pouvons remplacer par défaut canResignFirstResponder par sous-classement UITextfiled
tout ce que vous devez définir canResign variable avant et après rechargement de déclaration.
n'oubliez pas d'assigner la classe personnalisée champ texte Personnalisé.
Piste de la cellule clavier est actif, puis obtenir cette cellule particulière par
cellForRowAtIndexPath
et faire textView firstResponder- Je utiliser beginUpdate et endUpdate
Après la fin de la mise à jour, obtenir la cellule contient la zone de texte a déjà l'accent est ensuite le premier répondeur
Vous pouvez résoudre ce problème temporairement par le transfert de la première répondeur état à un autre objet. Habituellement, vous devez transférer le contrôle de l'entrée vue de votre ViewController. Depuis votre UIViewController hérite également de UIResponder, vous pouvez faire quelque chose comme ceci:
sur didSelect {
....
[yourViewController becomeFirstRespoder];
[_tableView reloadData];
[yourInputField becomeFirstResponder];
....
}
Ainsi, une fois que la table est rechargé, vous pouvez transférer firstResponder état de votre étiquette/champ.
Par défaut, le canBecomeFirstResponder est définie sur NON. Donc, vous pourriez avoir besoin pour remplacer la même chose dans votre ViewController. Aussi, vous pourriez avoir besoin pour faire la inputView pour votre vue-contrôleur le même que celui de votre UIPicker, sinon c'est peut rejeter votre sélecteur et afficher un clavier.