Dans la bibliothèque d'IB, l'introduction nous indique que lorsque la returntouche est enfoncée, le clavier de UITextView
disparaîtra. Mais en réalité, la returnclé ne peut agir que comme «\ n».
Je peux ajouter un bouton et utiliser [txtView resignFirstResponder]
pour masquer le clavier.
Mais existe-t-il un moyen d'ajouter l'action pour la returntouche du clavier afin que je n'aie pas besoin d'ajouter UIButton
?
iphone
objective-c
keyboard
uitextview
iphone-softkeyboard
Chilly Zhong
la source
la source
Réponses:
UITextView
n'a aucune méthode qui sera appelée lorsque l'utilisateur appuiera sur la touche retour. Si vous souhaitez que l'utilisateur ne puisse ajouter qu'une seule ligne de texte, utilisez aUITextField
. Frapper le retour et masquer le clavier pour unUITextView
ne suit pas les directives d'interface.Même alors, si vous voulez le faire, implémentez la
textView:shouldChangeTextInRange:replacementText:
méthode deUITextViewDelegate
et dans cette vérification si le texte de remplacement est\n
, cachez le clavier.Il pourrait y avoir d'autres moyens mais je n'en connais aucun.
la source
[textField setReturnKeyType: UIReturnKeyDone];
ou en utilisant le générateur d'interfaceJe pensais que je publierais l'extrait ici à la place:
Assurez-vous de déclarer la prise en charge du
UITextViewDelegate
protocole.Mise à jour Swift 4.0:
la source
Je sais que cela a déjà été répondu, mais je n'aime pas vraiment utiliser le littéral de chaîne pour la nouvelle ligne, alors voici ce que j'ai fait.
Mise à jour Swift 4.0:
la source
NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
.Je sais que cela a été répondu à de nombreuses reprises, mais voici mes deux cents à la question.
J'ai trouvé les réponses de samvermette et ribeto très utiles, ainsi que le commentaire de maxpower dans la réponse de ribeto . Mais il y a un problème avec ces approches. Le problème que Matt mentionne dans la réponse de la samvermette et c'est que si l'utilisateur veut coller quelque chose avec un saut de ligne à l'intérieur, le clavier se cacherait sans rien coller.
Mon approche consiste donc à mélanger les trois solutions mentionnées ci-dessus et à ne vérifier que si la chaîne entrée est une nouvelle ligne lorsque la longueur de la chaîne est 1, nous nous assurons donc que l'utilisateur tape au lieu de coller.
Voici ce que j'ai fait:
la source
Une manière plus élégante consiste à fermer le clavier lorsque l'utilisateur appuie quelque part en dehors du cadre du clavier.
Tout d'abord, définissez la vue de votre ViewController sur la classe "UIControl" dans l'inspecteur d'identité dans UIBuilder. Faites glisser la vue dans le fichier d'en-tête de ViewController et liez-la en tant qu'action avec l'événement comme Touch Up Inside, par exemple:
ViewController.h
Dans le fichier principal de ViewController, ViewController.m:
Vous pouvez exiger un double tapotement ou une longue pression en utilisant des techniques similaires. Vous devrez peut-être définir votre ViewController pour qu'il soit un UITextViewDelegate et connecter le TextView au ViewController. Cette méthode fonctionne pour UITextView et UITextField.
Source: Ranch Big Nerd
EDIT: Je voudrais également ajouter que si vous utilisez un UIScrollView, la technique ci-dessus peut ne pas fonctionner aussi facilement via Interface Builder. Dans ce cas, vous pouvez utiliser un UIGestureRecognizer et appeler à la place la méthode [[self view] endEditing: YES]. Un exemple serait:
Lorsque l'utilisateur touche en dehors du clavier et ne touche pas d'espace d'entrée, le clavier se ferme.
la source
GestureRecognizer
mais l'énorme problème est que tous les boutons ou contrôles de la vue ne sont plus cliquables.Ajoutez cette méthode dans votre contrôleur de vue.
Rapide :
Cette méthode peut également vous être utile:
la source
super.touchesBegan(touches:withEvent:)
.else { return true }
.Ajoutez également
UITextViewDelegate
N'oubliez pas de confirmer le protocole
SI vous n'avez pas ajouté,
if([text isEqualToString:@"\n"])
vous ne pouvez pas modifierla source
NO
si le texte est égal à@"\n"
.Il existe une autre solution lors de l'utilisation avec uitextview, vous pouvez ajouter la barre d'outils en tant que InputAccessoryView dans "textViewShouldBeginEditing", et à partir du bouton terminé de cette barre d'outils, vous pouvez fermer le clavier, le code pour cela est le suivant:
la source
J'ai trouvé que la réponse de josebama était la réponse la plus complète et la plus claire disponible dans ce fil.
Voici la syntaxe Swift 4 pour cela:
la source
resultRange
objectif est de tester si le texte ne contient que des sauts de ligne qui évitent le code dur "\ n".rapide
la source
Utilisation du contrôleur de navigation pour héberger une barre pour fermer le clavier:
dans le fichier .h:
dans le fichier .m:
la source
Tout comme un commentaire mat à samvermette, je n'aime pas non plus l'idée de détecter "\ n". La touche "retour" est là pour une raison dans UITextView, c'est d'aller à la ligne suivante bien sûr.
La meilleure solution à mon avis est d'imiter l'application de message iPhone - qui consiste à ajouter une barre d'outils (et un bouton) sur le clavier.
J'ai reçu le code du blog suivant:
http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Pas:
-Ajouter la barre d'outils à votre fichier XIB - définissez la hauteur sur 460
-Ajouter un élément du bouton de la barre d'outils (s'il n'est pas déjà ajouté). Si vous devez l'aligner à droite, ajoutez également l'élément de bouton de barre flexible à XIB et déplacez l'élément de bouton de barre d'outils
-Créer une action qui relie votre élément de bouton à resignFirstResponder comme suit:
-Alors:
la source
Je viens de résoudre ce problème d'une manière différente.
Faites glisser le bouton vers le
viewController.h
fichier et créez une action (Événement envoyé: Retouche à l'intérieur) comme:Dans
ViewController.m
devrait ressembler à:la source
Ajouter un observateur dans viewDidLoad
puis utilisez le sélecteur pour vérifier "\ n"
Il utilise "\ n" et ne vérifie pas spécifiquement une clé de retour, mais je pense que c'est OK.
MISE À JOUR
Voir la réponse de ribto ci-dessous qui utilise
[NSCharacterSet newlineCharacterSet]
à la place de\n
la source
\n
et la clé de retour est détectée en fonction de\n
sorte qu'il vérifie la clé de retour. La seule différence est que vous utilisez des notifications plutôt que d'utiliser les textViewDelegates.[NSCharacterSet newlineCharacterSet]
plutôt que \ n pourrait être une meilleure façon de procéder.Code rapide
Implémentez UITextViewDelegate dans votre classe / View comme ceci:
définissez le délégué textView sur self
Et puis implémentez les éléments suivants:
EDIT J'ai mis à jour le code car ce n'est jamais une bonne idée de changer l'entrée utilisateur dans un champ de texte pour une solution de contournement et de ne pas réinitialiser l'état une fois le code de piratage terminé.
la source
Essaye ça :
la source
// Vous pouvez utiliser ceci ...
Étape 1. La première étape consiste à vous assurer que vous déclarez la prise en charge du
UITextViewDelegate
protocole. Cela se fait dans votre fichier d'en-tête, comme exemple voici l'en-tête appeléEditorController.h:
Étape 2. Ensuite, vous devrez enregistrer le contrôleur en tant que délégué de l'UITextView. En
UITextView
reprenant l'exemple ci-dessus, voici comment j'ai initialisé le avec enEditorController
tant que délégué…Étape 3. Et maintenant, la dernière pièce du puzzle consiste à agir en réponse au
shouldCahngeTextInRange
message comme suit:la source
Vous pouvez également masquer le clavier lorsque vous touchez dans l'écran d'affichage:
la source
Réponse rapide:
la source
J'ai utilisé ce code pour changer de répondeur.
la source
La question demande comment le faire avec la touche retour mais je pense que cela pourrait aider quelqu'un avec l'intention de simplement faire disparaître le clavier lors de l'utilisation de UITextView:
Appelez addToolBarForTextView () dans viewDidLoad ou une autre méthode de cycle de vie.
Il semble que c'était la solution parfaite pour moi.
À votre santé,
Murat
la source
D'accord. Tout le monde a donné des réponses avec des astuces mais je pense que la bonne façon d'y parvenir est de
Connexion de l'action suivante à l' événement " Did End On Exit " dans
Interface Builder
. (cliquez avec le bouton droit de la sourisTextField
et faites glisser le curseur de la souris sur " Fin de la sortie " jusqu'à la méthode suivante.la source
Similaire à d'autres réponses utilisant la
UITextViewDelegate
mais une interface rapide plus récenteisNewline
serait:la source
la source
la source
Je sais que ce n'est pas la réponse exacte à cette question, mais j'ai trouvé ce fil après avoir cherché sur Internet une réponse. Je suppose que les autres partagent ce sentiment.
C'est mon écart de l'UITapGestureRecognizer que je trouve fiable et facile à utiliser - il suffit de définir le délégué du TextView au ViewController.
Au lieu de ViewDidLoad, j'ajoute UITapGestureRecognizer lorsque TextView devient actif pour l'édition:
Lorsque je tape en dehors de TextView, la vue met fin au mode d'édition et UITapGestureRecognizer se supprime pour que je puisse continuer à interagir avec les autres contrôles de la vue.
J'espère que ça aide. Cela semble si évident, mais je n'ai jamais vu cette solution nulle part sur le Web - est-ce que je fais quelque chose de mal?
la source
N'oubliez pas de définir le délégué pour le textView - sinon resignfirst responder ne fonctionnera pas.
la source
Essaye ça .
la source
Pour Xcode 6.4., Swift 1.2. :
la source
Vous devez ajouter
UIToolbar
en haut UITextView pour faciliter plutôt que d'utilisershouldChangeTextIn
Dans Swift 4
la source
toolbar.sizeToFit()