22

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

4

7 に答える 7

40

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

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

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

イベントはUIControlEventEditingChangedではなく UIControlEventValueChanged!

他の 2 つの提案されたソリューションよりも優れている点は次のとおりです。

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

通知を利用する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
}
于 2013-03-19T01:27:46.380 に答える
9

そのためには、まずテキストフィールドにデリゲート参照を割り当てる必要があります。また、デリゲートは、ビューのファイル所有者であるビューコントローラーであることが望ましいです。どちらが好きですか

myTextField.delegate = myViewControllerReferenceVariable

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

@interface MyViewController:UIViewController<UITextFieldDelegate>

そして、ビューコントローラーの実装オーバーライドで

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

面倒な私見のような通知を購読することもできます。ここでその方法を見つけることができます。

于 2013-03-19T02:14:39.960 に答える
1

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

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

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

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

ビュー コントローラーの割り当てが解除されたときに通知を登録解除することを忘れないでください。

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
于 2013-03-19T02:14:28.097 に答える
-3

このようにクラスメンバーを追加できますNSString *changeTemp

changetemp = textfield;

if( change temp != textfild ){
    changetemp=textfild;
    NSLog(@" text is changed"
} else { 
    NSLog(@" text isn't changed"):
}
于 2013-03-19T01:42:58.437 に答える