ios - uicontroleventeditingchanged - uitextfield did change swift




Событие изменения текста UITextField (12)

Как я могу обнаружить любые текстовые изменения в текстовом поле? Метод delegate shouldChangeCharactersInRange работает для чего-то, но он точно не соответствует моей потребности. Поскольку до тех пор, пока он не вернет YES, тексты textField недоступны другим методам наблюдения.

например, в моем коде calculateAndUpdateTextFields не получил обновленный текст, пользователь набрал.

Это их способ получить что-то вроде textChanged обработчика событий Java.

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

Swift 3 Версия:

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

   }

}

Не забудьте установить делегат.


Swift 3.1:

Селектор: ClassName.MethodName

  cell.lblItem.addTarget(self, action: #selector(NewListScreen.fieldChanged(textfieldChange:)), for: .editingChanged)

  func fieldChanged(textfieldChange: UITextField){

    }

Для Swift 3.0:

let textField = UITextField()

textField.addTarget(
    nil,
    action: #selector(MyClass.textChanged(_:)),
    for: UIControlEvents.editingChanged
)

используя класс:

class MyClass {
    func textChanged(sender: Any!) {

    }
}

Здесь в быстрой версии для того же.

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField) {

}

Спасибо


Мы можем легко настроить это из Storyboard , CTRL перетащить @IBAction и change следующим образом:


От правильного пути, чтобы сделать изменение текста в тексте uitextfield :

Я улавлю персонажей, отправленных в UITextField, что-то вроде этого:

// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

Затем в методе textFieldDidChange: вы можете проверить содержимое текстового поля и при необходимости обновить представление таблицы.

Вы можете использовать это и поместить calculateAndUpdateTextFields в качестве своего selector .


С закрытием:

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

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

и использование

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

Это очень просто с наблюдателем и реактивным быстрым (RxCocoa & RxSwift).

Просто подпишитесь на текстовое свойство rx, как показано ниже:

myTextField.rx.text.subscribe { text in
   print("UITextFieldTextChangeEvent Text:\(text)")
}.disposed(by: disposeBag)

для установки прослушивателя событий:

[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

на самом деле слушать:

- (void)textFieldDidChange:(UITextField *)textField {
    NSLog(@"text changed: %@", textField.text);
}

Swift 4

func addNotificationObservers() {

    NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeAction(_:)), name: .UITextFieldTextDidChange, object: nil)

}

@objc func textFieldDidChangeAction(_ notification: NSNotification) {

    let textField = notification.object as! UITextField
    print(textField.text!)

}

Быстрая версия:

//Somewhere in your UIViewController, like viewDidLoad(){ ... }
self.textField.addTarget(
        self, 
        action: #selector(SearchViewController.textFieldDidChange(_:)),
        forControlEvents: UIControlEvents.EditingChanged
)

Параметры объяснены:

self.textField //-> A UITextField defined somewhere in your UIViewController
self //-> UIViewController
.textFieldDidChange(_:) //-> Can be named anyway you like, as long as it is defined in your UIViewController

Затем добавьте метод, который вы создали выше, в свой UIViewController :

//Gets called everytime the text changes in the textfield.
func textFieldDidChange(textField: UITextField){

    print("Text changed: " + textField.text!)

}

Версия Swift 3

yourTextField.addTarget(self, action: #selector(YourControllerName.textChanges(_:)), for: UIControlEvents.editingChanged)

И получить изменения здесь

func textChanges(_ textField: UITextField) {
    let text = textField.text! // your desired text here
    // Now do whatever you want.
}

Надеюсь, поможет.





uitextfielddelegate