Gibt es eine Möglichkeit zu erkennen, wann die Taste Backspace/ Deleteauf der iPhone-Tastatur eines UITextField
leeren Geräts gedrückt wird? Ich möchte wissen, wann Backspacenur gedrückt wird, wenn das UITextField
leer ist.
Basierend auf dem Vorschlag von @Alex Reynolds in einem Kommentar habe ich beim Erstellen meines Textfelds den folgenden Code hinzugefügt:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Diese Benachrichtigung wird empfangen ( handleTextFieldChanged
Funktion wird aufgerufen), aber immer noch nicht, wenn ich die BackspaceTaste in einem leeren Feld drücke . Irgendwelche Ideen?
Es scheint einige Verwirrung um diese Frage zu geben. Ich möchte eine Benachrichtigung erhalten, wenn die BackspaceTaste gedrückt wird. Das ist es. Die Lösung muss aber auch funktionieren, wenn die UITextField
bereits leer ist.
quelle
Antworten:
Dies mag ein langer Weg sein, aber es könnte funktionieren. Versuchen Sie, den Text des Textfelds auf ein Leerzeichen mit der Breite Null festzulegen
\u200B
. Wenn in einem leeren Textfeld die Rücktaste gedrückt wird, wird Ihr Leerzeichen tatsächlich gelöscht. Dann können Sie den Raum einfach wieder einfügen.Funktioniert möglicherweise nicht, wenn der Benutzer es schafft, das Caret links vom Feld zu verschieben.
quelle
UITextField
und implementieren ,canPerformAction:withSender:
umreturn NO
fürselect:
undselectAll:
Aktionen , wenn der Text in der Zeichenfolge entspricht@"\u200B"
.Swift 4:
Unterklasse
UITextField
:Implementierung:
Ziel c:
Unterklasse
UITextField
:Fügen Sie nun einfach MyTextFieldDelegate zu Ihrem hinzu
UIViewController
und setzen SieUITextFields
myDelegate aufself
:quelle
ViewController
Klasse, wenn ich den Delegaten meines Textfelds auf eine UnterklasseUITextField
anstelle vonUIViewController
deleteBackward()
wird nicht angerufen, wenn Siereturn false
intextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Update: In der Antwort von JacobCaraballo finden Sie ein Beispiel, das überschrieben wird
-[UITextField deleteBackward]
.Check out
UITextInput
hat speziellUIKeyInput
einedeleteBackward
Delegate-Methode , die immer aufgerufen wird, wenn die Löschtaste gedrückt wird. Wenn Sie etwas Einfaches tun, sollten Sie in Betracht ziehen, es einfach zu unterordnenUILabel
und an dasUIKeyInput
Protokoll anzupassen , wie dies von SimpleTextInput und diesem iPhone UIKeyInput-Beispiel durchgeführt wird . Hinweis:UITextInput
und seine Verwandten (einschließlichUIKeyInput
) sind nur in iOS 3.2 und höher verfügbar.quelle
Code wie folgt:
Vergessen Sie zum Schluss, die Eigenschaft Benutzerdefinierte Klasse des Textfelds in "MyTextField" zu ändern.
quelle
Schnelle Implementierung:
quelle
Ich habe anders gegründet als
subclass
Lösung. Sogar es ist ein bisschen seltsam, aber es funktioniert in Ordnung.Es ist ein bisschen seltsam für das Ergebnis des Vergleichs ist -8. Vielleicht irre ich mich irgendwann
C Programming
. Aber es ist die richtige Arbeit;)quelle
strcmp
Rückkehr-1, 0, or 1
? Das war mein Verständnis.UITextViewDelegate
Methode, nichtUITextFieldDelegate
.Probieren Sie die
delegate
Überprüfen Sie dann, ob das,
range.length == 1
was der Fall zu sein scheint, wennbackspace
getroffen wird.quelle
Verwenden Sie den folgenden Code, um die Löschtaste der Tastatur zu erkennen, auch wenn Ihr Textfeld leer ist.
Ziel c :
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Swift:
quelle
Die Antwort von Niklas Alvaeus half mir bei einem ähnlichen Problem
Ich habe den Eintrag auf einen bestimmten Zeichensatz beschränkt, aber die Leerzeichen ignoriert. Also habe ich es
range.length == 1
vor dem Trimmen überprüfen lassenNSString
. Wenn es wahr ist, gebe ich den String einfach zurück und schneide ihn nicht ab. Siehe untenquelle
Für diejenigen, die Probleme mit der Antwort von Jacob haben, habe ich meine Textfeld-Unterklasse wie folgt implementiert und es funktioniert großartig!
quelle
Ja, verwenden Sie die folgende Methode, um die Rücktaste zu erkennen, wenn textField leer ist.
Muss hinzufügen UITextFieldDelegate
yourTextField.delegate = self (MUSS ERFORDERLICH sein)
Schnell:
Ziel c:
quelle
Die beste Verwendung, die ich zum Erkennen der Rücktaste gefunden habe, ist das Erkennen, wenn der Benutzer die Rücktaste in einem leeren Bereich gedrückt hat
UITextField
. Wenn Sie beispielsweise Empfänger in der E-Mail-App "gesprudelt" haben, drücken Sie die Rücktaste in derUITextField
den letzten "gesprudelten" Empfänger aus.Dies kann auf ähnliche Weise wie die Antwort von Jacob Caraballo geschehen. Aber in Jacobs Antwort ist das
UITextField
ZeichenUITextField
bereits leer, wenn beim Senden der Rücktaste noch ein Zeichen übrig ist. Wenn die Delegatennachricht empfangen wird, ist das Zeichen bereits leer, sodass Sie es effektiv erkennenbackspace
ein Textfeld mit höchstens einem Zeichen erkennen.Wenn Sie
backspace
auf einemUITextField
mit genau null Zeichen (leer) erkennen möchten, sollten Sie die Nachricht an diedelegate
vor dem Anruf an sendensuper deleteBackward
. Beispielsweise:Die Schnittstelle für ein solches Textfeld würde ungefähr so aussehen:
quelle
In iOS 6 wird die deleteBackward-Methode im UITextField aufgerufen, wenn die Rücktaste gedrückt wird, auch wenn das Feld leer ist. Sie können also UITextField in eine Unterklasse unterteilen und Ihre eigene deleteBackward-Implementierung bereitstellen (auch Super's aufrufen).
Ich unterstütze immer noch iOS 5, daher brauche ich eine Kombination aus Andrews Antwort und dieser.
quelle
:) nur für den Titel "Detect Backspace", wo ich benutze
UIKeyboardTypeNumberPad
.Ich treffe heute Abend auch die gleiche Frage und folge meinem Code, um es herauszufinden:
Da mit
UIKeyboardTypeNumberPad
kann der Benutzer nur die Nummer oder die Rücktaste eingeben. Wenn die Länge der Zeichenfolge 0 ist, muss es sich um die Rücktaste handeln.Hoffe, dass das oben genannte etwas helfen wird.
quelle
Anstatt zu versuchen, vorab zu konstruieren, was im Textfeld sein wird, oder herauszufinden, welches Sonderzeichen in die
shouldChangeCharactersInRange
Methode eingegeben wurde , würde ich Folgendes vorschlagen:Auf diese Weise können Sie eine Methode direkt nach Abschluss des aktuellen Vorgangs aufrufen. Das Coole daran ist, dass der geänderte Wert zum Zeitpunkt des Abschlusses bereits im
UITextField
. An diesem Punkt können Sie einfach die Länge überprüfen und / oder anhand der vorhandenen Daten validieren.quelle
Die Unterklasse UITextField funktionierte unter iOS 8.3 nicht für mich, deleteBackward wurde nie aufgerufen.
Hier ist die Lösung, die ich verwendet habe, die auf allen iOS 8-Versionen funktioniert und die auch auf anderen iOS-Versionen funktionieren sollte
quelle
Fügen Sie in der .h-Datei den UIKeyInput-Delegaten hinzu
verbesserte Formatierung
quelle
Ich habe die ähnliche Lösung mit geringfügigen Verbesserungen implementiert, die mir mitteilen, dass das Textfeld einen Wert hat, während der Benutzer auf die Rücktaste getippt hat. Dies ist in meinem Fall nützlich, wenn ich mich nur auf ein anderes Textfeld konzentrieren sollte, wenn das Textfeld leer ist, wenn die Rücktaste gedrückt wird.
quelle
Bei der Antwort mit den meisten Pappeln fehlt eines - die Fähigkeit zu erkennen, ob das Textfeld leer war oder nicht.
Wenn Sie also die deleteBackwards () -Methode einer TextField-Unterklasse überschreiben, wissen Sie immer noch nicht, ob das Textfeld bereits leer war. (Sowohl vor als auch nach deleteBackwards ()
textField.text!
ist eine leere Zeichenfolge:""
)Hier ist meine Verbesserung mit einer Überprüfung der Leere vor dem Löschen.
1. Erstellen Sie ein Delegatenprotokoll, das UITextFieldDelegate erweitert
2. Unterklasse UITextField
3. Implementieren Sie Ihr neues Delegatenprotokoll
quelle
Umfassender Handler für Textfelder mit einstelliger Nummer für Swift 5.1 :
1 Schritt
2 Schritt
3 Schritt
quelle
Hier meine Lösung basierend auf @ andrew Idee:
irgendwo, zum Beispiel in viewDidLoad
und dann
quelle
Sie können den Text der Textansicht / des Textfelds überprüfen, um festzustellen, ob er leer ist, und sicherstellen, dass der Ersatztext auch in der delegate-Methode shouldChangeTextIn leer ist.
quelle
Etwas wie das:
Natürlich ist der Hash für eine Zeichenkette.
quelle
Verwenden der TextField Delegate-Methode:
Fügen Sie den folgenden Code in der obigen Methode hinzu, um ein Löschereignis zu erkennen
quelle
Um es einfach zu halten, ist hier die einzige Bedingung, die Sie überprüfen müssen
quelle
quelle
In
UITextViewDelegate
:es funktioniert ok für mich.
Update für chinesische vereinfachte Pinyin- und chinesische Handschrifteingabe:
Basis auf dem Dokument sagt:
"Wenn der Benutzer die Taste drückt
deleteKey
, beträgt die Länge des Bereichs 1, und ein leeres Zeichenfolgenobjekt ersetzt dieses einzelne Zeichen."quelle
UITextField
, nichtUITextView
.