でテキストが変更されたかどうかを検出して、変更を保存UITextField
できるようにしたいと考えています。UIButton
7 に答える
通知を監視したり を実装したりする代わりに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
通知を利用する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
}
そのためには、まずテキストフィールドにデリゲート参照を割り当てる必要があります。また、デリゲートは、ビューのファイル所有者であるビューコントローラーであることが望ましいです。どちらが好きですか
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
}
面倒な私見のような通知を購読することもできます。ここでその方法を見つけることができます。
元の文字列を格納する変数を作成し、通知センターに登録して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];
このようにクラスメンバーを追加できますNSString *changeTemp
。
changetemp = textfield;
if( change temp != textfild ){
changetemp=textfild;
NSLog(@" text is changed"
} else {
NSLog(@" text isn't changed"):
}