ここで述べたように:UITextFieldテキスト変更イベント、iOS 6(iOS 6.0および6.1がチェックされている)の時点ではUITextField
、を監視するだけではオブジェクトの変更を完全に検出できないようUITextFieldTextDidChangeNotification
です。
内蔵iOSキーボードによって直接行われた変更のみが追跡されるようです。つまり、UITextField
次のように呼び出すだけでオブジェクトを変更した場合、変更myUITextField.text = @"any_text"
についてはまったく通知されません。
これがバグなのか、それとも意図されたものなのかはわかりません。ドキュメントに適切な説明が見つからなかったため、バグのようです。これについても、UITextFieldテキスト変更イベントで説明されています。
これに対する私の「解決策」は、自分が行ったすべての変更について、自分で通知を実際に投稿することですUITextField
(その変更が組み込みのiOSキーボードを使用せずに行われた場合)。このようなもの:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
このようにして、コードで「手動」で更新したとき、または組み込みのiOSキーボード.text
を使用してUITextField
オブジェクトのプロパティを変更したときにも、同じ通知を受け取ることを100%確信できます。
これは文書化された動作ではないため、このアプローチでは、UITextField
オブジェクトの同じ変更に対して2つの通知が受信される可能性があることを考慮することが重要です。必要に応じて(UITextField.text
変更時に実際に行うこと)、これは不便な場合があります。
UITextFieldTextDidChangeNotification
通知が自分のものであるか「iOS製」であるかを実際に知る必要がある場合は、少し異なるアプローチとして、カスタム通知(これは以外のカスタム名を使用)を投稿します。
編集:
私はちょうど良いかもしれないと思う別のアプローチを見つけました:
これには、Objective-C のキー値監視(KVO)機能(http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA)。
基本的に、プロパティのオブザーバーとして自分自身を登録し、このプロパティが変更された場合に通知されます。「原理」はNSNotificationCenter
動作方法と非常に似ており、このアプローチがiOS 6以降でも自動的に動作する主な利点です(通知を手動で投稿するなどの特別な調整は必要ありません)。
私達のためのUITextField
あなたのあなたは、たとえば、このコードを追加する場合、これはうまく動作します-scenario、UIViewController
テキストフィールドが含まれています。
static void *myContext = &myContext;
- (void)viewDidLoad {
[super viewDidLoad];
//Observing changes to myUITextField.text:
[myUITextField addObserver:self forKeyPath:@"text"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:myContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(context == myContext) {
//Here you get notified every time myUITextField's "text" property is updated
NSLog(@"New value: %@ - Old value: %@",
[change objectForKey:NSKeyValueChangeNewKey],
[change objectForKey:NSKeyValueChangeOldKey]);
}
else
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
「コンテキスト」管理に関するこの回答の功績:https : //stackoverflow.com/a/12097161/2078512
注:組み込みのiOSキーボードでを編集しUITextField
ている間、テキストフィールドの「text」プロパティは、新しい文字がすべて入力/削除されても更新されないようです。代わりに、テキストフィールドのファーストレスポンダステータスを辞任すると、テキストフィールドオブジェクトが「全体として」更新されます。