ここで述べたように:UITextFieldテキスト変更イベント、iOS 6UITextField
(iOS 6.0および6.1がチェックされている)の時点では、を観察するだけではオブジェクトの変更を完全に検出することはできないよう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
てオブジェクトのプロパティを変更したときに、同じ通知を受け取ることが100%確実になります。UITextField
これは文書化された動作ではないため、このアプローチでは、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
このコードを追加すると、これは問題なく機能します。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」プロパティが新しい文字を入力/削除するたびに更新されるわけではないようです。代わりに、テキストフィールドのファーストレスポンダーステータスを辞任した後、テキストフィールドオブジェクトは「全体として」更新されます。