642 Stimmen

UITextField Textänderung Ereignis

Wie kann ich Textänderungen in einem textField erkennen? Die Delegatenmethode shouldChangeCharactersInRange funktioniert für irgendetwas, aber es hat meinen Bedarf nicht genau erfüllt. Denn solange es nicht YES zurückgibt, sind die textField-Texte für andere Beobachtermethoden nicht verfügbar.

z.B. in meinem Code calculateAndUpdateTextFields nicht den aktualisierten Text erhalten hat, hat der Benutzer getippt.

Gibt es eine Möglichkeit, etwas zu bekommen wie textChanged Java-Ereignishandler.

- (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;
}

2voto

HsuChihYung Punkte 129

Sie sollten die Benachrichtigung verwenden, um dieses Problem zu lösen, da die andere Methode auf das Eingabefeld und nicht auf die eigentliche Eingabe hört, insbesondere wenn Sie die chinesische Eingabemethode verwenden. In viewDidload

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:)
                                                 name:@"UITextFieldTextDidChangeNotification"
                                               object:youTarget];

dann

- (void)textFiledEditChanged:(NSNotification *)obj {
UITextField *textField = (UITextField *)obj.object;
NSString *toBestring = textField.text;
NSArray *currentar = [UITextInputMode activeInputModes];
UITextInputMode *currentMode = [currentar firstObject];
if ([currentMode.primaryLanguage isEqualToString:@"zh-Hans"]) {
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    if (!position) {
        if (toBestring.length > kMaxLength)
            textField.text =  toBestring;
} 

}

Endlich, du rennst, du bist fertig.

2voto

Joseph Francis Punkte 1003

Swift 3 Version:

class SomeClass: UIViewController, UITextFieldDelegate { 

   @IBOutlet weak var aTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        aTextField.delegate = self
        aTextField.addTarget(self, action: #selector(SignUpVC.textFieldDidChange), for: UIControlEvents.editingChanged)        
    }

   func textFieldDidChange(_ textField: UITextField) {

       //TEXT FIELD CHANGED..SECRET STUFF

   }

}

Vergessen Sie nicht, den Delegierten festzulegen.

2voto

ebohdas Punkte 21

Mit Verschluss:

   class TextFieldWithClosure: UITextField {
    var targetAction: (() -> Void)? {
        didSet {
            self.addTarget(self, action: #selector(self.targetSelector), for: .editingChanged)
        }
    }

    func targetSelector() {
        self.targetAction?()
    }
    }

und mit

textField.targetAction? = {
 // will fire on text changed
 }

1voto

PeiweiChen Punkte 413
[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(didChangeTextViewText:) 
name:UITextFieldTextDidChangeNotification object:nil];

- (void) didChangeTextViewText {
 //do something
}

1voto

smileBot Punkte 19189

Eine Sache ist, dass Sie mehrere UITextFields haben können. Geben Sie ihnen also ein Tag, und dann können Sie die Tags einschalten. Hier ist, wie man einen Beobachter in jeder Klasse ziemlich viel Setup.

private func setupTextFieldNotification() {
    NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: nil, queue: OperationQueue.main) { (notification) in
        if let textField = notification.object as? UITextField, textField.tag == 100, let text = textField.text {
            print(#line, text)
        }
    }
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X