web-dev-qa-db-ja.com

UITextfieldのテキストの変更を検出する

UITextFieldでテキストが変更されたかどうかを検出できるようにしたいので、UIButtonを有効にして変更を保存できます。

21
RGriffiths

UITextFieldTextDidChange通知を利用するか、テキストフィールドにデリゲートを設定して、textField:shouldChangeCharactersInRange:replacementString

通知で変更を監視する場合は、notificationに登録するためにコードで次のようなものが必要になります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];

ここで、theTextFieldは、監視したいUITextFieldのインスタンスです。上記のコードでselfがインスタンスであるクラスは、次のようにtextFieldDidChangeを実装する必要があります。

- (void)textFieldDidChange:(NSNotification *)notification {
    // Do whatever you like to respond to text changes here.
}

テキストフィールドがobserverよりも長持ちする場合は、オブザーバのdeallocメソッドで通知するために登録解除を実行する必要があります。実際、テキストフィールドがオブザーバーよりも長くない場合でも、これを行うことをお勧めします。

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Other dealloc work
}
33
Aaron Golden

通知を監視したり、textField:shouldChangeCharacterInRange:replacementString:、イベントターゲットを追加する方が簡単です。

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

- (void)myTextFieldDidChange:(id)sender {
    // Handle change.
}

イベントはUIControlEventEditingChangedおよびnotUIControlEventValueChanged!です。

他の2つの推奨ソリューションに対する利点は次のとおりです。

  • コントローラーをNSNotificationCenterから登録解除することを覚えておく必要はありません。
  • イベントハンドラーは、afterが呼び出された後に呼び出されます。つまり、textField.textには、ユーザーが実際に入力したテキストが含まれます。 textField:shouldChangeCharacterInRange:replacementString:デリゲートメソッドは、変更が適用される前に呼び出されるため、textField.textは、ユーザーが入力したばかりのテキストをまだ提供していません。最初に自分で変更を適用する必要があります。
39
DarkDust

そのためには、まずテキストフィールドに委任参照を割り当てる必要があります。そして、デリゲートは、できればビューのファイル所有者であるvewコントローラーでなければなりません。どっちがいい

myTextField.delegate = myViewControllerReferenceVariable

そして、viewControllerインターフェースで、UITextFieldDelegateを実装することを伝えます。

@interface MyViewController:UIViewController<UITextFieldDelegate>

そして、あなたのView Controller実装オーバーライドで

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

したがって、コードは次のようになります

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     {
        text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
        if (textfield == refToTextFieldYouWantToCheck) {
            if ( ! [textToCheck isEqualToString:text] ) {
               [theButtonRef setEnabled:YES];
            } 
         }
           return YES; //If you don't your textfield won't get any text in it
      }

また、厄介なIMHOのような通知をサブスクライブすることもできます。その方法は here です。

9
Jesly Varghese

Swift 3.0

プロセス1

UITextfiledのIBOutletを作成し、テキストフィールドにターゲットを追加します。

 m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)

 func textFieldDidChange(textField:UITextField)
 {
     NSLog(textField.text!)
 }

プロセス2

 m_lblTxt.delegate = self

 //MARK: - TextField Delegates
 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
 {
      print(textField.text!)
      return true
 }
2
Sunny

これは、Editing ChangedUITextFieldのイベント。それからコードにドラッグし、IBActionを作成します。

例えば:

@IBAction func textFieldChanged(_ sender: UITextField) {
  print(sender.text)
}

このイベントは、他の回答で説明されている.textプロパティには、トリガーされたときに更新されたテキスト入力が含まれます。これにより、ビュー内のすべてのUITextFieldにプログラムでイベントを追加する必要がなくなるため、コードの混乱を解消できます。

1
Mark Suman

元の文字列を格納する変数を作成し、通知センターに登録してUITextFieldTextDidChangeNotificationイベントを受信できます。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];

次に、通知を受信するメソッドを作成し、テキストフィールドの現在の値を元の値と比較します

-(void) updateButton:(NSNotification *)notification {
       self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}

View Controllerの割り当てが解除されたときに通知を登録解除することを忘れないでください。

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
1
Firas