[ios] UITextFieldテキスト変更イベント


8 Answers

XenElementの答えが出ています。

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

Question

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



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




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

   }

}

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




スウィフト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!)

}



迅速:

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

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

@objc func textFieldDidChange(textField: UITextField){

print("Text changed")

}



Swift 3.0の場合:

let textField = UITextField()

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

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

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

    }
}



スイフト3.1:

セレクタ:ClassName.MethodName

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

  func fieldChanged(textfieldChange: 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
}



スウィフト3

@IBAction func textfildChange(sender: UITextField) {
        if let number = sender.text {
            if number.isEmpty {

            } else {
               print(number)
            }
        }
    }





Related