ボタンを押すと、テキストフィールドのコンテンツ文字列は次のようになりますUIButton
。この場合、このテキストフィールドのコンテンツが変更されたことをどのように検出できますか?UITextField
This is a test string
このような場合、 psUITextField's
デリゲートメソッドは機能しません
更新:この動作をiOS6以降のデバイスで実行したい。
ボタンを押すと、テキストフィールドのコンテンツ文字列は次のようになりますUIButton
。この場合、このテキストフィールドのコンテンツが変更されたことをどのように検出できますか?UITextField
This is a test string
このような場合、 psUITextField's
デリゲートメソッドは機能しません
更新:この動作をiOS6以降のデバイスで実行したい。
:を追加できUITextFieldTextDidChangeNotification
ます
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:textField];
textField
(paramオブジェクト)はUITextFieldです。
selector
この通知が発行されたときに呼び出されるメソッドです。
たぶん、単純なKey-Valueの観察が機能するでしょうか?
[textField addObserver:self forKeyPath:@"text" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"text"] && object == textField) {
// text has changed
}
}
編集:私はちょうどそれをチェックしました、そしてそれは私のために働きます。
UIControlEventEditingChanged
イベント内でテキストの変更を処理できます。したがって、プログラムでテキストを変更する場合は、次のイベントを送信してください。
textField.text = @"This is a test string";
[textField sendActionsForControlEvents:UIControlEventEditingChanged];
デリゲートメソッドは実際に機能する場合があります。テキストフィールド、変更される範囲、および新しい文字列を取得します。これらを組み合わせて、提案された文字列を決定できます。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSMutableString *proposed = [NSMutableString stringWithString:textField.text];
[proposed replaceCharactersInRange:range withString:string];
NSLog(@"%@", proposed);
// Do stuff.
return YES; // Or NO. Whatever. It's your function.
}
これはかなり堅牢なソリューションですが、機能するはずです。ボタンを押すと呼び出される関数で...
NSString *string = [NSString stringWithFormat:@"This is a test string"];
if(string == textfield.text){
...
}
または、セルフスケジューラを使用して、繰り返し変更されているかどうかを確認できます。
これがakashivskyyの答えのSwift3バージョンです:
func startObservingTextView() {
textView.addObserver(self, forKeyPath:"text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
}
func stopObservingTextView() {
textView.removeObserver(self, forKeyPath: "text")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let textViewObject = object as? UITextView, textViewObject == textView, keyPath == "text" {
// text has changed
}
}
これがakashivskyyの答えのSwift5.4バージョンです。
NSKeyValueObservationキー値監視を使用します。
class ViewController: UIViewController {
@IBOutlet weak var txtTextField: UITextField!
private var textObservation: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
textObservation = self.txtTextField.observe(\.text, options: [.new, .old], changeHandler: { (object, value) in
print("New value is : ", value.newValue)
print("Old value is : ", value.oldValue)
})
}
}