Wie kann ich Textänderungen in einem textField erkennen? Die Delegate-Methode shouldChangeCharactersInRange
funktioniert für etwas, hat aber meine Anforderungen nicht genau erfüllt. Da die textField-Texte bis zur Rückgabe von YES anderen Beobachtermethoden nicht zur Verfügung stehen.
zB in meinem Code calculateAndUpdateTextFields
nicht den aktualisierten Text erhalten, hat der Benutzer eingegeben.
Ist ihre Möglichkeit, so etwas zu bekommen textChanged
Java Event Handler .
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
Antworten:
Von der richtigen Art, einen Textwechsel in Uitextfield durchzuführen, rufen Sie zurück :
In Ziel-C:
In Swift:
Sie können das verwenden und berechneAndUpdateTextFields als Ihre setzen
selector
.quelle
NO
, was logisch ist, denn wenn SieNO
von dieser Methode zurückkehren, sagen Sie im Grunde, dass sich der Text im Feld nicht ändern sollte.textField.text = "Some new value";
. Gibt es eine clevere Möglichkeit, dies zu erfassen?UITextFieldDelegate
dass so etwas enthalten gewesenfunc textField: UITextField, didChangeText text: String
wäre, aber ... (gibt Jungs bei Apple einen schmutzigen Blick)Die Antwort von XenElement ist genau richtig.
Dies kann auch im Interface Builder durchgeführt werden, indem Sie mit der rechten Maustaste auf das UITextField klicken und das Sendeereignis "Bearbeiten geändert" auf Ihre Unterklasseneinheit ziehen.
quelle
So stellen Sie den Ereignis-Listener ein:
um tatsächlich zuzuhören:
quelle
Schnell:
Implementieren Sie dann die Rückruffunktion:
quelle
Wie hier angegeben: UITextField-Textänderungsereignis Es scheint, dass es ab iOS 6 (iOS 6.0 und 6.1 aktiviert) nicht möglich ist, Änderungen an
UITextField
Objekten vollständig zu erkennen, wenn Sie nur das beobachtenUITextFieldTextDidChangeNotification
.Es scheint, dass jetzt nur die Änderungen verfolgt werden, die direkt über die integrierte iOS-Tastatur vorgenommen wurden. Dies bedeutet, dass Sie nicht über Änderungen informiert werden , wenn Sie Ihr
UITextField
Objekt nur durch Aufrufen von Folgendes ändern :myUITextField.text = @"any_text"
.Ich weiß nicht, ob dies ein Fehler ist oder beabsichtigt ist. Scheint ein Fehler zu sein, da ich in der Dokumentation keine vernünftige Erklärung gefunden habe. Dies wird auch hier angegeben: UITextField-Textänderungsereignis .
Meine "Lösung" besteht darin, für jede Änderung, die ich an meiner vornehme, eine Benachrichtigung von mir selbst zu veröffentlichen
UITextField
(wenn diese Änderung ohne Verwendung der integrierten iOS-Tastatur vorgenommen wird). Etwas wie das:Auf diese Weise können Sie zu 100% sicher sein, dass Sie dieselbe Benachrichtigung erhalten, wenn Sie die
.text
Eigenschaft IhresUITextField
Objekts ändern , entweder wenn Sie es "manuell" in Ihrem Code aktualisieren oder über die integrierte iOS-Tastatur.Da dies kein dokumentiertes Verhalten ist, kann dieser Ansatz dazu führen, dass zwei Benachrichtigungen für dieselbe Änderung in Ihrem
UITextField
Objekt empfangen werden. Abhängig von Ihren Anforderungen (was Sie tatsächlich tun, wenn SieUITextField.text
Änderungen vornehmen) kann dies eine Unannehmlichkeit für Sie sein.Ein etwas anderer Ansatz wäre das Posten einer benutzerdefinierten Benachrichtigung (dh mit einem anderen benutzerdefinierten Namen als
UITextFieldTextDidChangeNotification
), wenn Sie tatsächlich wissen müssen, ob die Benachrichtigung Ihre oder "iOS-made" war.BEARBEITEN:
Ich habe gerade einen anderen Ansatz gefunden, der meiner Meinung nach besser sein könnte:
Dies beinhaltet die Key-Value Observing (KVO) -Funktion von Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid) / 10000177-BCICJDHA ).
Grundsätzlich registrieren Sie sich als Beobachter einer Immobilie und wenn sich diese Eigenschaft ändert, werden Sie darüber informiert. Das "Prinzip" ist der Funktionsweise ziemlich ähnlich.
NSNotificationCenter
Dies ist der Hauptvorteil, dass dieser Ansatz auch ab iOS 6 automatisch funktioniert (ohne spezielle Anpassungen wie das manuelle Posten von Benachrichtigungen).In unserem
UITextField
Szenario funktioniert dies einwandfrei, wenn Sie diesen Code beispielsweise zu Ihrem Code hinzufügenUIViewController
, der das Textfeld enthält:Gutschrift auf diese Antwort bezüglich "Kontext" -Verwaltung: https://stackoverflow.com/a/12097161/2078512
Hinweis: Scheint , wie während Sie sind in dem Prozess der eine Bearbeitung
UITextField
mit dem eingebauten in iOS - Tastatur, die „Text“ Eigenschaft des Textfeldes wird nicht mit jedem neuen Buchstaben aktualisiert getippt / entfernt. Stattdessen wird das Textfeldobjekt "als Ganzes" aktualisiert, nachdem Sie den Ersthelferstatus des Textfelds aufgegeben haben.quelle
Wir können das einfach konfigurieren, indem Sie bei
Storyboard
gedrückter STRG-Taste das@IBAction
Ereignis ändern und wie folgt ändern:quelle
Hier in schneller Version für das gleiche.
Vielen Dank
quelle
Ich habe das Problem behoben, durch das das Verhalten von shouldChangeChractersInRange geändert wurde. Wenn Sie NEIN zurückgeben, werden die Änderungen von iOS nicht intern übernommen. Stattdessen haben Sie die Möglichkeit, sie manuell zu ändern und nach den Änderungen alle Aktionen auszuführen.
quelle
Swift-Version getestet:
Parameter erklärt:
Fügen Sie dann die oben erstellte Methode in Folgendes ein
UIViewController
:quelle
Swift 4
quelle
Für Swift 3.0:
mit Klasse wie:
quelle
Swift 3 Version
Und holen Sie sich die Änderungen hier
Ich hoffe es hilft.
quelle
Sie sollten die Benachrichtigung verwenden, um dieses Problem zu lösen, da die andere Methode das Eingabefeld und nicht die tatsächlich eingegebene Methode abhört, insbesondere wenn Sie die chinesische Eingabemethode verwenden. In viewDidload
dann
}}
Endlich rennst du, fertig.
quelle
Swift 3.1:
quelle
Swift 3 Version:
Vergessen Sie nicht, den Delegaten festzulegen.
quelle
Mit Verschluss:
und mit
quelle
KVO funktioniert unter iOS NICHT für Steuerelemente: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html
Vorausgesetzt, Sie kennen die Textansicht, die Sie ansehen möchten:
Mach das:
Seien Sie jedoch vorsichtig damit:
Es ist wahrscheinlich, dass Sie das nur einmal aufrufen möchten. Rufen Sie es also nicht an, z.
layoutSubviews
Es ist ziemlich schwierig zu wissen, wann Sie es während Ihres Aufrufprozesses am besten anrufen können. Es wird von Ihrer Situation abhängen. Leider gibt es keine Standardlösung
Zum Beispiel kann man es normalerweise sicher nicht rechtzeitig aufrufen
init
, da es natürlich nochwatchedTextView
nicht existiert.
Keine der Benachrichtigungen wird aufgerufen, wenn der Text programmgesteuert geändert wird .
Dies ist ein riesiges, uraltes und dummes Ärgernis in der iOS-Technik.
Steuerelemente rufen die Benachrichtigungen einfach nicht auf, wenn die Eigenschaft .text programmgesteuert geändert wird.
Dies ist wahnsinnig ärgerlich, da natürlich - offensichtlich - jede App, die jemals erstellt wurde, den Text programmgesteuert festlegt, z. B. das Löschen des Felds nach dem Posten durch den Benutzer usw.
Sie müssen die Textansicht (oder ein ähnliches Steuerelement) wie folgt unterordnen:
(Tipp - nicht das Super Anruf vergessen hat zu kommen , bevor die Post an!) .
Es ist keine Lösung verfügbar, es sei denn, Sie korrigieren das Steuerelement durch Unterklassen wie oben gezeigt. Das ist die einzige Lösung.
Beachten Sie, dass die Benachrichtigung
führt zu
gerufen werden.
( Nicht
textViewDidChange
.)quelle
quelle
Eine Sache ist, dass Sie möglicherweise mehrere UITextFields haben. Geben Sie ihnen ein Tag und Sie können die Tags einschalten. Hier erfahren Sie, wie Sie einen Beobachter in einer beliebigen Klasse einrichten.
quelle
Swift 4 Version
Verwenden der Schlüsselwertbeobachtung Benachrichtigen Sie Objekte über Änderungen an den Eigenschaften anderer Objekte.
quelle