ios swift change - UITextFieldテキスト変更イベント





9 Answers

XenElementの答えが出ています。

上記はインターフェースビルダーでもUITextFieldを右クリックし、 "変更を編集中"のsendイベントをサブクラスユニットにドラッグすることで行うことができます。

event swift3 uitextview

textFieldでテキストの変更を検出するにはどうすればよいですか? デリゲートメソッドshouldChangeCharactersInRangeは何かのために機能しますが、私の必要性を正確に満たしませんでした。 YESを返すまで、textFieldテキストは他のオブザーバメソッドでは使用できません。

たとえば、私のコードのcalculateAndUpdateTextFieldsは更新されたテキストを取得せず、ユーザーは入力しました。

彼らはtextChanged Javaイベントハンドラのようなものを手に入れることがtextChangedます。

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



迅速:

yourTextfield.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

次に、コールバック関数を実装します。

@objc func textFieldDidChange(textField: UITextField){

print("Text changed")

}



StoryboardからCTRLで@IBActionとchangeイベントを次のようにドラッグするように簡単に設定できます:




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 3.0の場合:

let textField = UITextField()

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

次のようなクラスを使用します。

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

    }
}



この問題を解決するには、特に中国語の入力方法を使用するときは、実際に入力されていない入力ボックスを他の方法で聴くため、通知を使用する必要があります。 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;
} 

}

ついにあなたは走ります。




クロージャ付き:

   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
 }



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

   }

}

デリゲートを設定することを忘れないでください。




オブザーバーとリアクションスピード(RxCocoa&RxSwift)を使用するのは本当にシンプルです。

rxのテキストプロパティを購読するだけで、以下のようになります:

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



Related