ตามที่ระบุไว้ที่นี่: เหตุการณ์ 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];
วิธีนี้คุณจะมั่นใจ 100% ว่าคุณจะได้รับการแจ้งเตือนแบบเดียวกันเมื่อคุณเปลี่ยน.text
คุณสมบัติของUITextField
วัตถุของคุณไม่ว่าจะเป็นเมื่อคุณอัปเดต "ด้วยตนเอง" ในรหัสของคุณหรือผ่านแป้นพิมพ์ iOS ในตัว
เป็นสิ่งสำคัญที่จะต้องพิจารณาว่าเนื่องจากนี่ไม่ใช่พฤติกรรมที่ทำเป็นเอกสารแนวทางนี้อาจนำไปสู่การแจ้งเตือนที่ได้รับ 2 ครั้งสำหรับการเปลี่ยนแปลงในUITextField
วัตถุของคุณ ขึ้นอยู่กับความต้องการของคุณ (สิ่งที่คุณทำจริงเมื่อมีUITextField.text
การเปลี่ยนแปลง) สิ่งนี้อาจไม่สะดวกสำหรับคุณ
แนวทางที่แตกต่างกันเล็กน้อยคือการโพสต์การแจ้งเตือนที่กำหนดเอง (นี่คือด้วยชื่อที่กำหนดเองนอกเหนือจากUITextFieldTextDidChangeNotification
) หากคุณจำเป็นต้องรู้ว่าการแจ้งเตือนนั้นเป็นของคุณหรือ "ที่ทำด้วย iOS"
แก้ไข:
ฉันเพิ่งพบวิธีที่แตกต่างซึ่งฉันคิดว่าน่าจะดีกว่า:
สิ่งนี้เกี่ยวข้องกับคุณสมบัติKey-Value Observing (KVO)ของ Objective-C ( 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
หมายเหตุ: ดูเหมือนว่าขณะที่คุณอยู่ในขั้นตอนของการแก้ไขUITextField
ที่มีแป้นพิมพ์ในตัว iOS ของคุณ, สถานที่ให้บริการ "ข้อความ" ของช่องข้อความจะไม่ปรับปรุงด้วยจดหมายทุกฉบับใหม่พิมพ์ / ลบออก แต่วัตถุฟิลด์ข้อความจะได้รับการอัปเดต "โดยรวม" หลังจากคุณลาออกสถานะการตอบกลับแรกของฟิลด์ข้อความ