Событие изменения текста UITextField
как я могу обнаружить любые изменения текста в текстовом поле? Делегат метод 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;
}
19 ответов:
С правильный способ сделать uitextfield изменение текста перезвоните:
Я ловлю символы, отправленные в элемент управления UITextField что-то вроде этого:
// Add a "textFieldDidChange" notification method to the text field control. [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];затем в методе textFieldDidChange: вы можете изучить содержимое текстового поля и при необходимости перезагрузить представление таблицы.
вы могли бы использовать это и поставить calculateAndUpdateTextFields в своем
selector.
ответ XenElement находится на месте.
вышесказанное можно сделать и в interface builder, щелкнув правой кнопкой мыши на поле UITextField и перетащив событие" Editing Changed " send в ваш подкласс.
установить прослушиватель событий:
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];чтобы на самом деле слушать:
- (void)textFieldDidChange:(UITextField *)textField { NSLog(@"text changed: %@", textField.text); }
Swift:
yourTextfield.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)затем реализовать функцию обратного вызова:
@objc func textFieldDidChange(textField: UITextField){ print("Text changed") }
как указано здесь: событие изменения текста UITextField кажется, что начиная с iOS 6 (iOS 6.0 и 6.1 проверено) невозможно полностью обнаружить изменения в
UITextFieldобъекты просто наблюдаяUITextFieldTextDidChangeNotification.похоже, что теперь отслеживаются только те изменения, которые были сделаны непосредственно встроенной клавиатурой iOS. Это означает, что если вы измените свой
здесь в swift версии для того же.
textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) func textFieldDidChange(textField: UITextField) { }спасибо
Я решил проблему, изменив поведение shouldChangeChractersInRange. Если вы вернете NO, изменения не будут применены iOS внутренне, вместо этого у вас есть возможность изменить его вручную и выполнить любые действия после изменений.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //Replace the string manually in the textbox textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string]; //perform any logic here now that you are sure the textbox text has changed [self didChangeTextInTextField:textField]; return NO; //this make iOS not to perform any action }
Swift версия протестирована:
//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.0:
let textField = UITextField() textField.addTarget( nil, action: #selector(MyClass.textChanged(_:)), for: UIControlEvents.editingChanged )использование класса как:
class MyClass { func textChanged(sender: Any!) { } }
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!) }
вы должны использовать уведомление,чтобы решить эту проблему,потому что другой метод будет слушать поле ввода не на самом деле ввода, особенно при использовании китайского метода ввода. В 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; }}
наконец, вы бежите, будет сделано.
Swift 3.1:
Селектор: Имя Класса.Имя_метода
cell.lblItem.addTarget(self, action: #selector(NewListScreen.fieldChanged(textfieldChange:)), for: .editingChanged) func fieldChanged(textfieldChange: UITextField){ }
С закрытия:
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 }
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeTextViewText:) name:UITextFieldTextDidChangeNotification object:nil]; - (void) didChangeTextViewText { //do something }
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 Version
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. }надеюсь, что это помогает.
это очень просто с наблюдателем и реактивной swift (RxCocoa & RxSwift).
просто подпишитесь на текстовое свойство rx, как показано ниже:
myTextField.rx.text.subscribe { text in print("UITextFieldTextChangeEvent Text:\(text)") }.disposed(by: disposeBag)
Swift 3
@IBAction func textfildChange(sender: UITextField) { if let number = sender.text { if number.isEmpty { } else { print(number) } } }


Comments