UITextField
でテキストが変更されたかどうかを検出できるようにしたいので、UIButton
を有効にして変更を保存できます。
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
}
通知を監視したり、textField:shouldChangeCharacterInRange:replacementString:
、イベントターゲットを追加する方が簡単です。
[textField addTarget:self
action:@selector(myTextFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
- (void)myTextFieldDidChange:(id)sender {
// Handle change.
}
イベントはUIControlEventEditingChanged
およびnotUIControlEventValueChanged
!です。
他の2つの推奨ソリューションに対する利点は次のとおりです。
NSNotificationCenter
から登録解除することを覚えておく必要はありません。textField.text
には、ユーザーが実際に入力したテキストが含まれます。 textField:shouldChangeCharacterInRange:replacementString:
デリゲートメソッドは、変更が適用される前に呼び出されるため、textField.text
は、ユーザーが入力したばかりのテキストをまだ提供していません。最初に自分で変更を適用する必要があります。そのためには、まずテキストフィールドに委任参照を割り当てる必要があります。そして、デリゲートは、できればビューのファイル所有者である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 です。
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
}
これは、Editing Changed
UITextField
のイベント。それからコードにドラッグし、IBAction
を作成します。
例えば:
@IBAction func textFieldChanged(_ sender: UITextField) {
print(sender.text)
}
このイベントは、他の回答で説明されている.text
プロパティには、トリガーされたときに更新されたテキスト入力が含まれます。これにより、ビュー内のすべてのUITextField
にプログラムでイベントを追加する必要がなくなるため、コードの混乱を解消できます。
元の文字列を格納する変数を作成し、通知センターに登録して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];