Seperti yang dinyatakan di sini: Peristiwa perubahan teks UITextField , tampaknya pada iOS 6 (iOS 6.0 dan 6.1 dicentang) tidak mungkin untuk sepenuhnya mendeteksi perubahan UITextField
objek hanya dengan mengamati UITextFieldTextDidChangeNotification
.
Tampaknya hanya perubahan itu yang dilakukan secara langsung oleh keyboard iOS bawaan yang dilacak sekarang. Ini berarti bahwa jika Anda mengubah UITextField
objek Anda hanya dengan memanggil sesuatu seperti ini:, myUITextField.text = @"any_text"
Anda tidak akan diberitahu tentang perubahan sama sekali.
Saya tidak tahu apakah ini bug atau memang dimaksudkan. Sepertinya bug karena saya belum menemukan penjelasan yang masuk akal dalam dokumentasi. Ini juga dinyatakan di sini: Acara perubahan teks UITextField .
"Solusi" saya untuk ini adalah mengirimkan pemberitahuan sendiri untuk setiap perubahan yang saya buat UITextField
(jika perubahan itu dilakukan tanpa menggunakan keyboard iOS bawaan). Sesuatu seperti ini:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Dengan cara ini Anda 100% yakin bahwa Anda akan menerima pemberitahuan yang sama ketika Anda mengubah .text
properti UITextField
objek Anda , baik ketika Anda memperbarui "secara manual" dalam kode Anda atau melalui keyboard iOS bawaan.
Penting untuk mempertimbangkan bahwa, karena ini bukan perilaku yang terdokumentasi, pendekatan ini dapat menyebabkan 2 pemberitahuan diterima untuk perubahan yang sama pada UITextField
objek Anda . Tergantung pada kebutuhan Anda (apa yang sebenarnya Anda lakukan saat UITextField.text
perubahan), ini bisa menjadi ketidaknyamanan bagi Anda.
Pendekatan yang sedikit berbeda adalah memposting pemberitahuan khusus (ini, dengan nama khusus selain UITextFieldTextDidChangeNotification
) jika Anda benar-benar perlu tahu apakah pemberitahuan itu milik Anda atau "buatan iOS".
EDIT:
Saya baru saja menemukan pendekatan berbeda yang menurut saya bisa lebih baik:
Ini melibatkan fitur Key-Value Observing (KVO) dari Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Pada dasarnya, Anda mendaftarkan diri sebagai pengamat properti dan jika properti ini berubah, Anda akan diberi tahu tentangnya. "Prinsip" sangat mirip dengan cara NSNotificationCenter
kerjanya, menjadi keuntungan utama bahwa pendekatan ini bekerja secara otomatis juga pada iOS 6 (tanpa tweak khusus seperti harus memposting pemberitahuan secara manual).
Untuk UITextField
skenario kami, ini berfungsi dengan baik jika Anda menambahkan kode ini, misalnya, Anda UIViewController
yang berisi bidang teks:
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];
}
Kredit untuk jawaban ini mengenai manajemen "konteks": https://stackoverflow.com/a/12097161/2078512
Catatan: Sepertinya saat Anda sedang dalam proses mengedit a UITextField
dengan keyboard iOS bawaan, properti "teks" dari bidang teks tidak diperbarui dengan setiap huruf baru diketik / dihapus. Sebaliknya, objek bidang teks akan diperbarui "secara keseluruhan" setelah Anda mengundurkan diri status responden pertama dari bidang teks.