In der IB-Bibliothek heißt es in der Einführung, dass beim returnDrücken der Taste die Tastatur für UITextView
verschwindet. returnTatsächlich kann der Schlüssel jedoch nur als '\ n' fungieren.
Ich kann eine Schaltfläche hinzufügen und [txtView resignFirstResponder]
damit die Tastatur ausblenden.
Aber gibt es eine Möglichkeit, die Aktion für die returnTaste in der Tastatur hinzuzufügen, damit ich sie nicht hinzufügen muss UIButton
?
iphone
objective-c
keyboard
uitextview
iphone-softkeyboard
Chilly Zhong
quelle
quelle
Antworten:
UITextView
hat keine Methoden, die aufgerufen werden, wenn der Benutzer die Eingabetaste drückt. Wenn Sie möchten, dass der Benutzer nur eine Textzeile hinzufügen kann, verwenden Sie aUITextField
. Wenn Sie die Eingabetaste drücken und die Tastatur für aUITextView
ausblenden, folgen Sie nicht den Richtlinien der Benutzeroberfläche.Selbst dann, wenn Sie dies tun möchten, implementieren Sie die
textView:shouldChangeTextInRange:replacementText:
Methode vonUITextViewDelegate
und überprüfen Sie dabei, ob der Ersatztext ist\n
verbergen Sie , die Tastatur.Es könnte andere Wege geben, aber mir sind keine bekannt.
quelle
[textField setReturnKeyType: UIReturnKeyDone];
Ich dachte, ich würde das Snippet stattdessen hier posten:
Stellen Sie sicher, dass Sie die Unterstützung für das
UITextViewDelegate
Protokoll deklarieren .Swift 4.0 Update:
quelle
Ich weiß, dass dies bereits beantwortet wurde, aber ich mag es nicht wirklich, das String-Literal für die Newline zu verwenden. Deshalb habe ich Folgendes getan.
Swift 4.0 Update:
quelle
NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
.Ich weiß, dass dies oft beantwortet wurde, aber hier sind meine zwei Cent für das Problem.
Ich fand die Antworten von samvermette und ribeto wirklich nützlich, und auch den Kommentar von maxpower in der ribeto ‚s Antwort. Bei diesen Ansätzen gibt es jedoch ein Problem. Das Problem, das Matt in der Samvermette erwähnt Antwort , ohne dass etwas , wenn der Benutzer etwas mit einem Zeilenumbruch einfügen möchte.
Mein Ansatz ist also eine Mischung aus den drei oben genannten Lösungen und es wird nur geprüft, ob die eingegebene Zeichenfolge eine neue Zeile ist, wenn die Länge der Zeichenfolge 1 beträgt. Daher stellen wir sicher, dass der Benutzer tippt, anstatt sie einzufügen.
Folgendes habe ich getan:
quelle
Eine elegantere Möglichkeit besteht darin, die Tastatur zu schließen, wenn der Benutzer irgendwo außerhalb des Tastaturrahmens tippt.
Stellen Sie zunächst die Ansicht Ihres ViewControllers im Identitätsinspektor in UIBuilder auf die Klasse "UIControl" ein. Ziehen Sie die Ansicht bei gedrückter Ctrl-Taste in die Header-Datei des ViewControllers und verknüpfen Sie sie als Aktion mit dem Ereignis als Touch Up Inside, z.
ViewController.h
In der ViewController-Hauptdatei ist ViewController.m:
Mit ähnlichen Techniken können Sie zweimal tippen oder lange berühren. Möglicherweise müssen Sie Ihren ViewController als UITextViewDelegate festlegen und die TextView mit dem ViewController verbinden. Diese Methode funktioniert sowohl für UITextView als auch für UITextField.
Quelle: Big Nerd Ranch
BEARBEITEN: Ich möchte auch hinzufügen, dass die obige Technik bei Verwendung eines UIScrollView möglicherweise nicht so einfach über den Interface Builder funktioniert. In diesem Fall können Sie einen UIGestureRecognizer verwenden und stattdessen die darin enthaltene Methode [[self view] endEditing: YES] aufrufen. Ein Beispiel wäre:
Wenn der Benutzer außerhalb der Tastatur tippt und nicht auf ein Eingabefeld tippt, wird die Tastatur geschlossen.
quelle
GestureRecognizer
aber das große Problem ist, dass nicht alle Schaltflächen oder Steuerelemente in der Ansicht mehr anklickbar sind.Fügen Sie diese Methode in Ihren View Controller ein.
Swift :
Diese Methode kann auch für Sie hilfreich sein:
quelle
super.touchesBegan(touches:withEvent:)
.else { return true }
.Fügen Sie auch hinzu
UITextViewDelegate
Vergessen Sie nicht, das Protokoll zu bestätigen
Wenn Sie nicht hinzugefügt haben
if([text isEqualToString:@"\n"])
, können Sie nicht bearbeitenquelle
NO
wenn der Text gleich ist@"\n"
.Bei der Verwendung mit uitextview gibt es eine andere Lösung: Sie können die Symbolleiste als InputAccessoryView in "textViewShouldBeginEditing" hinzufügen und über die Schaltfläche "Fertig" dieser Symbolleiste die Tastatur schließen. Der Code hierfür lautet wie folgt:
quelle
Ich fand die Antwort von Josebama die vollständigste und sauberste Antwort in diesem Thread.
Unten ist die Swift 4- Syntax dafür:
quelle
resultRange
Ziele zu testen , ob der Text enthält nur neue Zeilen , die schwer Code „\ n“ vermeiden.schnell
quelle
Verwenden des Navigationscontrollers zum Hosten einer Leiste zum Schließen der Tastatur:
in der .h-Datei:
in der .m-Datei:
quelle
Genau wie bei einem matten Kommentar zu Samvermette gefällt mir auch die Idee, "\ n" zu erkennen, nicht. Die "Return" -Taste ist aus einem Grund in UITextView vorhanden, der natürlich zur nächsten Zeile führen soll.
Die beste Lösung ist meiner Meinung nach die Nachahmung der iPhone-Nachrichten-App, dh das Hinzufügen einer Symbolleiste (und einer Schaltfläche) auf der Tastatur.
Ich habe Code aus folgendem Blog-Beitrag erhalten:
http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Schritte:
- Fügen Sie Ihrer XIB-Datei eine Symbolleiste hinzu - stellen Sie die Höhe auf 460 ein
- Fügen Sie ein Symbolleistenschaltflächenelement hinzu (falls nicht bereits hinzugefügt). Wenn Sie es nach rechts ausrichten müssen, fügen Sie XIB auch ein flexibles Element mit Balkenschaltflächen hinzu und verschieben Sie das Element mit den Symbolleistenschaltflächen
- Erstellen Sie eine Aktion, die Ihr Schaltflächenelement wie folgt mit resignFirstResponder verknüpft:
-Dann:
quelle
Habe dieses Problem einfach anders gelöst.
Ziehen Sie die Schaltfläche bei gedrückter Ctrl-Taste in die
viewController.h
Datei und erstellen Sie eine Aktion (gesendetes Ereignis: Touch Up Inside) wie folgt:In
ViewController.m
sollte aussehen wie:quelle
Fügen Sie einen Beobachter in viewDidLoad hinzu
und verwenden Sie dann den Selektor, um nach "\ n" zu suchen.
Es wird "\ n" verwendet und nicht speziell nach einem Return-Schlüssel gesucht, aber ich denke, das ist in Ordnung.
AKTUALISIEREN
Siehe die Antwort von ribto unten, die
[NSCharacterSet newlineCharacterSet]
anstelle von verwendet wird\n
quelle
\n
und der Return-Schlüssel wird basierend darauf erkannt,\n
so dass nach dem Return-Schlüssel gesucht wird. Der einzige Unterschied besteht darin, dass Sie Benachrichtigungen anstelle von textViewDelegates verwenden.[NSCharacterSet newlineCharacterSet]
es besser wäre, nach \ n zu suchen als nach \ n.SWIFT-Code
Implementieren Sie UITextViewDelegate in Ihrer Klasse / Ansicht wie folgt:
Setzen Sie den textView-Delegaten auf self
Und implementieren Sie dann Folgendes:
BEARBEITEN Ich habe den Code aktualisiert, da es nie eine gute Idee ist, die Benutzereingabe in einem Textfeld für eine Problemumgehung in zu ändern und den Status nach Abschluss des Hack-Codes nicht zurückzusetzen.
quelle
Versuche dies :
quelle
// Du kannst das benutzen ...
Schritt 1. Der erste Schritt besteht darin, sicherzustellen, dass Sie die Unterstützung für deklarieren
UITextViewDelegate
Protokoll . Dies geschieht in Ihrer Header-Datei. Als Beispiel wird hier der Header genanntEditorController.h:
Schritt 2. Als nächstes müssen Sie den Controller als Delegierten von UITextView registrieren. Ausgehend vom obigen Beispiel habe ich hier das
UITextView
mitEditorController
als Delegat initialisiert …Schritt 3. Und jetzt besteht das letzte Puzzleteil darin, auf die
shouldCahngeTextInRange
Nachricht wie folgt zu reagieren :quelle
Sie können die Tastatur auch ausblenden, wenn Sie sie auf dem Bildschirm berühren:
quelle
Schnelle Antwort:
quelle
Ich habe diesen Code verwendet, um den Responder zu ändern.
quelle
In der Frage wird gefragt, wie es mit der Eingabetaste gemacht werden soll, aber ich denke, dies könnte jemandem helfen, der die Tastatur bei Verwendung von UITextView einfach verschwinden lassen möchte:
Rufen Sie addToolBarForTextView () in viewDidLoad oder einer anderen Lebenszyklusmethode auf.
Es scheint, dass dies die perfekte Lösung für mich war.
Prost,
Murat
quelle
OK. Jeder hat Antworten mit Tricks gegeben, aber ich denke, der richtige Weg, dies zu erreichen, ist durch
Verbinden der folgenden Aktion mit dem Ereignis " Did End On Exit " in
Interface Builder
. (Klicken Sie mit der rechtenTextField
Maustaste auf und ziehen Sie bei gedrückter Ctrrl-Taste von " Wurde beim Beenden beendet " auf die folgende Methode.quelle
Ähnlich wie bei anderen Antworten mit der
UITextViewDelegate
neueren, schnellen BenutzeroberflächeisNewline
wäre:quelle
quelle
quelle
Ich weiß, dass es nicht die genaue Antwort auf diese Frage ist, aber ich habe diesen Thread gefunden, nachdem ich im Internet nach einer Antwort gesucht habe. Ich gehe davon aus, dass andere dieses Gefühl teilen.
Dies ist meine Varianz des UITapGestureRecognizer, die ich für zuverlässig und einfach zu verwenden halte. Setzen Sie einfach den Delegaten der Textansicht auf den ViewController.
Anstelle von ViewDidLoad füge ich den UITapGestureRecognizer hinzu, wenn die Textansicht zum Bearbeiten aktiv wird:
Wenn ich außerhalb der Textansicht tippe, beendet die Ansicht den Bearbeitungsmodus und der UITapGestureRecognizer entfernt sich selbst, sodass ich weiterhin mit anderen Steuerelementen in der Ansicht interagieren kann.
Ich hoffe das hilft. Es scheint so offensichtlich, aber ich habe diese Lösung noch nie im Internet gesehen - mache ich etwas falsch?
quelle
Vergessen Sie nicht, den Delegaten für die Textansicht festzulegen - andernfalls funktioniert resignfirstresponder nicht.
quelle
Versuche dies .
quelle
Für Xcode 6.4. Swift 1.2. ::
quelle
Sie sollten
UIToolbar
UITextView nach oben hinzufügen, um es einfacher zu machen als zu verwendenshouldChangeTextIn
In Swift 4
quelle
toolbar.sizeToFit()