web-dev-qa-db-ja.com

UIControlEventEditingChangedは、UITextfieldのsetTextを使用しても発生しません

私は現在、テキストフィールドの状態を追跡しようとしています。

-setTextを介してテキストを設定するカスタムdatePickerを使用しています

[self.textField setText:[self.dateFormatter stringFromDate:self.date]];

私の内部textFieldDelegate私は次のコードを書きました:

-(void)viewDidLoad {
  [super viewDidLoad];
  self.travelToOnTextField.delegate = self;
  [self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}

-(void)travelToOnTextFieldDidChange:(id)sender
{
   NSLog(@"Event Handler called");
}

カスタムDatepickerを使用してテキストを変更すると、メソッドtravelToOnDateTextFieldDidChangeが呼び出されません。しかし、コンピュータのキーボードを使用してテキストを変更すると、何らかの理由で呼び出されます。

これは意図的なものですか?

49
Sebastian Boldt

これはsuper重要なので、この質問を評価する必要がありました。

これはiOS6で変更されたようです。多分iOS5です。このイベント[〜#〜] used [〜#〜]は、UITextFieldでテキストの変更を監視するための推奨メソッドです。 iOS3から使用しています。 iOS6でアプリを再コンパイルして更新を行ったところ、不思議なことに動作が停止しました。私のアプリの使用部分:

[UITextField insertText];

と他の人が使う

[UITextField setText];

または

UITextField.text = @"xxx";

何らかの理由で、setTextイベントがEditing Changedイベントを発生させないことに注意することが重要です。 insertTextメソッドを使用する場合でも、機能します。

したがって、バインドされていて、簡単な修正が必要な場合は、コードを次のように変更できます。

textField.text;

または

[textField setText:@"xxx"];

textField.text = @"";
[textField insertText:@"new text"];

これも機能します:

[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged];

これが誰かのお役に立てば幸いです。iOS6に移行したときに、なぜこのコードが突然機能しなくなったのかを理解するために丸一日無駄にしたからです。

NSNotificationCenterも引き続き使用できます。詳細については、UITextFieldリファレンスを参照してください。

https://developer.Apple.com/documentation/uikit/uitextfield

80
Shaolo

テキストを設定した後、sendActionsForControlEvents:を呼び出すだけです。

self.textField.text = xxx;
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged];

IOS 9でテスト済み。

17
Gon

Swift 2.2 +、@ Shaoloの回答に基づく

  1. IBActionを接続し、デフォルトのイベントタイプをEditingChangedに変更するように注意してください

enter image description here

  1. TextFieldのテキストをコードから変更した後、sendActionsLineも追加します

    taskTextField.text = nil
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)
    
5
zgorawski

ドキュメントは言う:

UIControlEventEditingChanged 
A touch making an editing change in a UITextField objet. 
Available in iOS 2.0 and later. 
Declared in UIControl.h.

だからtouchだけ?

4
Charlie Price

更新:Swift 4.2

textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)
2
gayashanbc