Событие изменения текста UITextField - PullRequest
531 голосов
/ 10 августа 2011

Как я могу обнаружить любые изменения текста в текстовом поле?Метод делегата shouldChangeCharactersInRange работает для чего-то, но он не полностью соответствует моим потребностям.Так как, пока это не возвращает ДА, тексты 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;
}

Ответы [ 19 ]

5 голосов
/ 04 сентября 2016

Для Swift 3.0:

let textField = UITextField()

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

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

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

    }
}
4 голосов
/ 04 декабря 2017

Версия 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.
}

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

2 голосов
/ 21 июня 2017

С закрытием:

   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
 }
2 голосов
/ 11 апреля 2017

Swift 3.1:

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

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

  func fieldChanged(textfieldChange: UITextField){

    }
2 голосов
/ 25 апреля 2016

Вы должны использовать уведомление для решения этой проблемы, потому что другой метод будет прослушивать поле ввода, а не фактический ввод, особенно когда вы используете китайский метод ввода.В viewDidload

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

затем

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

}

наконец, вы запустите, будет сделано.

1 голос
/ 06 июня 2017

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

   }

}

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

1 голос
/ 04 января 2016
[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(didChangeTextViewText:) 
name:UITextFieldTextDidChangeNotification object:nil];



- (void) didChangeTextViewText {
 //do something
}
0 голосов
/ 19 марта 2019

Версия Swift 4

Использование наблюдения значения ключа Уведомление объектов об изменениях свойств других объектов.

var textFieldObserver: NSKeyValueObservation?

textFieldObserver = yourTextField.observe(\.text, options: [.new, .old]) { [weak self] (object, changeValue) in
  guard let strongSelf = self else { return }
  print(changeValue)
}
0 голосов
/ 30 июня 2018

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

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

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