web-dev-qa-db-ja.com

フィールドが更新されたときにUITextFieldの「値が変更されました」が起動しない

Interface BuilderでIBAction要素に接続したUITextFieldがあります。 (「値が変更された」イベントの発生)

また、値が調整されるとTextField要素を自動的に更新するUISliderもあります。

アプリを実行すると、スライダーを調整するとTextFieldが更新されますが、これが発生すると「値が変更されました」イベントは発生しません。 TextFieldを手動で編集しても、value changedイベントは発生しません。 (Did Editing Endトリガーを使用すると、トリガーが起動しますが)。

私の質問は、TextFieldのプログラムによる更新と、ユーザーが値を調整したときの両方で、値変更トリガーを起動する方法です。

68

TheRoninが示唆するように、UITextFieldDelegateを使用して、次のメソッドを実装します

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
3
Ilanchezhian

UIControlEventValueChangedUITextFieldを使用しないでください。必要なのはUIControlEventEditingChangedです。

204
Mark Adams

取得するため EditingChanged textfield event、次のようにセレクタを追加することをお勧めします

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

テキストフィールドの値が変更されると、このtextChanged:セレクター。

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}
70
iKT

テキストフィールドにデリゲートを割り当てる場合、(以下のデリゲートメソッドからNOを返すと、イベント(編集の変更)はトリガーされません。このメソッドからNOを返す場合は、イベントリスナーを呼び出すことを検討してください。

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
11
Nech

古い質問ですが、最初に見つけた検索結果で、満足できる答えはありません。このソリューションが最適に動作することがわかりました: Swift UITextFieldサブクラスはプログラムでテキストの変更を処理します

UITextFieldのテキストプロパティをオーバーライドしてdidSet()を追加し、そこから値変更関数を呼び出します。

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }
2
robert

Swift 4:

class YourViewController: UIViewController {
    // MARK: Outlets
    @IBOutlet weak var titleTextField: UITextField!

    // MARK: View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        titleTextField.delegate = self
    }
}

// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        print("changed")
        return true
    }
}
0
balazs630

値はプログラムで割り当てられますが、その場合、実際にはtextFieldが変更されていないため、textFieldDidChangeが呼び出されることはありません。この外部イベントのために渡す必要があります

例:textfield.sendActions(for:.editingChanged)これは、変更された編集イベントを発生させ、値がプログラムで変更された後でもtextFieldDidChangeが呼び出されます。

このイベントを適用する場所

提出されたテキストに値を割り当てた後、例えばtextfield.text = "some value"

0