15

ボタンを押すと、テキストフィールドのコンテンツ文字列は次のようになりますUIButton。この場合、このテキストフィールドのコンテンツが変更されたことをどのように検出できますか?UITextFieldThis is a test string

このような場合、 psUITextField'sデリゲートメソッドは機能しません

更新:この動作をiOS6以降のデバイスで実行したい。

4

7 に答える 7

16

:を追加できUITextFieldTextDidChangeNotificationます

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldChanged:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:textField];

textField(paramオブジェクト)はUITextFieldです。 selectorこの通知が発行されたときに呼び出されるメソッドです。

于 2012-12-19T12:11:52.983 に答える
14

たぶん、単純なKey-Valueの観察が機能するでしょうか?

[textField addObserver:self forKeyPath:@"text" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if([keyPath isEqualToString:@"text"] && object == textField) {
        // text has changed
    }
}

編集:私はちょうどそれをチェックしました、そしてそれは私のために働きます。

于 2012-12-24T21:15:16.957 に答える
6

UIControlEventEditingChangedイベント内でテキストの変更を処理できます。したがって、プログラムでテキストを変更する場合は、次のイベントを送信してください。

textField.text = @"This is a test string";
[textField sendActionsForControlEvents:UIControlEventEditingChanged];
于 2012-12-22T09:57:10.897 に答える
4

デリゲートメソッドは実際に機能する場合があります。テキストフィールド、変更される範囲、および新しい文字列を取得します。これらを組み合わせて、提案された文字列を決定できます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range        replacementString:(NSString *)string
{
    NSMutableString *proposed = [NSMutableString stringWithString:textField.text];
    [proposed replaceCharactersInRange:range withString:string];
    NSLog(@"%@", proposed);
    // Do stuff.
    return YES; // Or NO. Whatever. It's your function.
}
于 2013-12-12T19:57:28.663 に答える
1

これはかなり堅牢なソリューションですが、機能するはずです。ボタンを押すと呼び出される関数で...

NSString *string = [NSString stringWithFormat:@"This is a test string"];
if(string == textfield.text){
...
}

または、セルフスケジューラを使用して、繰り返し変更されているかどうかを確認できます。

于 2012-12-22T21:45:21.547 に答える
1

これがakashivskyyの答えのSwift3バージョンです:

func startObservingTextView() {
    textView.addObserver(self, forKeyPath:"text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
}

func stopObservingTextView() {
    textView.removeObserver(self, forKeyPath: "text")
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let textViewObject = object as? UITextView, textViewObject == textView, keyPath == "text" {
        // text has changed
    }
}
于 2017-07-05T09:11:49.860 に答える
1

Swift 5.4

これがakashivskyyの答えのSwift5.4バージョンです。

NSKeyValueObservationキー値監視を使用します。

class ViewController: UIViewController {
    
    @IBOutlet weak var txtTextField: UITextField!
    
    private var textObservation: NSKeyValueObservation?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textObservation = self.txtTextField.observe(\.text, options: [.new, .old], changeHandler: { (object, value) in
            print("New value is : ", value.newValue)
            print("Old value is : ", value.oldValue)
        })
    }
}
于 2021-06-16T07:47:49.350 に答える