サブクラスUITextField
化していて、フィールド内のテキストが変更されるたびにコードを実行する方法が必要です。どうすればよいですか?
(このクラス内にロジックを記述すれば、クラス外にクリーンなコードを記述できます... つまり、 を使用して求めていることを実行UITextFieldDelegate
できますが、クラスの外部からしかアクセスできません。)
サブクラスUITextField
化していて、フィールド内のテキストが変更されるたびにコードを実行する方法が必要です。どうすればよいですか?
(このクラス内にロジックを記述すれば、クラス外にクリーンなコードを記述できます... つまり、 を使用して求めていることを実行UITextFieldDelegate
できますが、クラスの外部からしかアクセスできません。)
カスタムクリアボタンが必要な同じユースケースに遭遇しました。setText: をオーバーライドできることを期待して UITextField のサブクラス化を試みましたが、希望どおりに文字が入力または削除されるたびに呼び出されるわけではないため、行き止まりであることが判明しました。私は次の解決策を思いつきました:
- (void)awakeFromNib {
[super awakeFromNib];
self.clearButtonMode = UITextFieldViewModeNever;
UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[clearButton setTitle:@"x" forState:UIControlStateNormal];
[clearButton addTarget:self action:@selector(clearText:) forControlEvents:UIControlEventTouchDown];
self.rightView = clearButton;
[self addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textChanged:(UITextField *)sender {
self.rightViewMode = sender.text.length > 0 ? UITextFieldViewModeWhileEditing : UITextFieldViewModeNever;
}
- (void)clearText:(UIButton *)sender {
self.text = @"";
[self textChanged:self];
}
UIControlEventEditingChanged を使用すると、キーボードによるテキストの変更に対応できますが、コードでテキストを設定することはできません。clearText: メソッドによってもたらされたテキストにも応答したいので、クリアに続いて手動で textChanged: メソッドを呼び出す必要があります。テキストが別の場所のコードで設定されている場合は、補正するために textChanged を呼び出す必要があります。
ビューコントローラーの .h ファイルで、このデリデートを定義するだけです
@interface yourviewcontroller <UITextFieldDelegate>
その後、.m ファイルで以下のコードを使用します。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
.....Do Somthing Here....
}
これは、テキスト フィールドのテキストが変更されたときのデリゲート メソッドです。このメソッドは everytime と呼ばれます。
UITextFieldDelegate メソッドを使用しないことで、その外側のコードはどのようにきれいになりますか? ビュークラス(UITextField)に変更への対応方法を伝えようとすることで、MVC設計パラダイムを破っています。これは、コントローラーの目的です。デリゲートの実装で物事を処理するのではなく、setText をオーバーライドする方がクリーンだと思う理由について、もう少し洞察を与えることができますか?