2010-02-22 4 views
6

J'ai un textField dans un tableViewCell. J'ai récemment remarqué que si je saisis une valeur dans le textBox, puis fais défiler la cellule hors de l'écran, la valeur dans la zone de texte disparaît.iPhone - textField dans un tableViewCell - Le défilement hors écran efface la valeur

J'ai une protection contre cela. S'il n'y a pas de UIKeyboard présent, la tableView ne peut pas défiler assez loin pour avoir à redessiner la cellule. Cependant, certains utilisateurs n'utilisent pas la touche «fait» du clavier pour faire disparaître le clavier, et font plutôt défiler la table, brisant le programme.

Existe-t-il un moyen de stocker immédiatement la chaîne textField dans une variable, ou empêcher le défilement de tableView, ou de faire disparaître le clavier si l'utilisateur essaie de faire défiler le tableauView?

Je n'ai pas de fichier NIB pour cette vue, c'est un tableViewController par programmation, donc je ne peux rien faire dans Interface Builder avec des boutons personnalisés invisibles, comme suggéré dans d'autres questions sur StackOverflow.

Répondre

5

Installez-vous le champ de texte dans votre méthode cellForRowAtIndexPath ::? Si tel est le cas, il se peut qu'il réinstalle chaque fois que la cellule défile dans la vue.

Vous devez enregistrer une référence au champ de texte sur votre contrôleur et le réutiliser dans votre cellForRowAtIndexPath ::

+0

J'utilise un bloc de requête case pour ajouter textField à la section 0, ligne 2. TextField est déclaré dans l'en-tête comme un pointeur, donc je peux accéder aux propriétés en utilisant myTextField.text. Est-ce que cela aide? – Justin

+0

Je ne suis pas tout à fait. Voulez-vous dire dans votre méthode cellForRowAtIndexPath que vous avez une déclaration de cas qui détermine si vous êtes à la section 0, ligne 2 et si oui, elle ajoute le champ de texte? Si oui, où appelez-vous [[UITextField alloc] init]? Si c'est également dans la méthode cellForRowAtIndexPath, vous êtes probablement en train de réinitialiser le champ de texte à chaque fois que la ligne défile dans la vue (et que cellForRowAtIndexPath est appelée). Essayez d'initialiser votre champ de texte dans loadView ou la méthode init principale de votre contrôleur. – chrissr

0

La réponse à cette question est de mettre en œuvre la méthode déléguée ScrollView willBeginDragging. UITableView hérite de UIScrollView.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; 
     [textField resignFirstResponder]; 
} 

Ce rejette le clavier dès que le défilement commence tableView

Par cet héritage, il est également possible de garder la tableView de défilement, période. Définissez la propriété scrollEnabled NO, à la

self.tableView.scrollEnabled = NO; 
0

Vous devez installerez le délégué du NSTextField vous avez créé au contrôleur, puis mettre en œuvre textField:shouldChangeCharactersInRange:replacementString: dans votre contrôleur afin que vous êtes informé à tout moment les changements de texte dans le champ de texte .

Lorsque les modifications de texte stockent le texte modifié dans une propriété de votre contrôleur.

Lorsque vous créez le NSTextField dans cellForRowAtIndexPath définissez la valeur de cette propriété. N'oubliez pas qu'avec Cocoa, vous devez conserver les données de votre modèle séparées de votre vue.

+0

Mais que se passe-t-il lorsque le champ textField défile et que la valeur est supprimée. La variable d'instance perd elle aussi sa valeur? – Justin

+0

Non, lorsque delegate appelle textField: shouldChangeCharactersInRange: replacementString, vous devez copier la chaîne du champ de texte dans une propriété d'instance afin qu'elle soit valide après la suppression de UITableViewCell. –

Questions connexes