जैसा कि यहां कहा गया है: UITextField पाठ परिवर्तन घटना , ऐसा लगता है कि iOS 6 (iOS 6.0 और 6.1 की जाँच की गई) के रूप में UITextField
केवल वस्तुओं के परिवर्तनों का पूरी तरह से पता लगाना संभव नहीं है UITextFieldTextDidChangeNotification
।
ऐसा लगता है कि केवल अंतर्निहित iOS कीबोर्ड द्वारा सीधे किए गए उन परिवर्तनों को अभी ट्रैक किया गया है। इसका मतलब यह है कि यदि आप UITextField
किसी वस्तु को इस तरह से बदलकर अपनी वस्तु को बदलते हैं : myUITextField.text = @"any_text"
तो आपको किसी भी बदलाव के बारे में सूचित नहीं किया जाएगा।
मुझे नहीं पता कि यह बग है या इसका इरादा है। एक बग की तरह लगता है क्योंकि मुझे प्रलेखन में कोई उचित स्पष्टीकरण नहीं मिला है। यह यहाँ भी कहा गया है: UITextField text change event ।
इसका मेरा "समाधान" वास्तव में मेरे द्वारा किए गए हर परिवर्तन के लिए स्वयं द्वारा एक अधिसूचना पोस्ट करना है 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
वस्तु की संपत्ति बदलते हैं , तो आप उसी अधिसूचना को प्राप्त करेंगे , या तो जब आप इसे अपने कोड में "मैन्युअल रूप से" अपडेट करेंगे या अंतर्निहित आईओएस कीबोर्ड के माध्यम से।
यह विचार करना महत्वपूर्ण है कि, चूंकि यह प्रलेखित व्यवहार नहीं है, इसलिए इस दृष्टिकोण से आपकी UITextField
वस्तु में समान परिवर्तन के लिए 2 सूचनाएं प्राप्त हो सकती हैं । आपकी आवश्यकताओं के आधार पर (आप अपने UITextField.text
परिवर्तनों के दौरान वास्तव में क्या करते हैं) यह आपके लिए एक असुविधा हो सकती है।
UITextFieldTextDidChangeNotification
यदि आप वास्तव में यह जानना चाहते हैं कि क्या नोटिफिकेशन आपका था या "iOS-made" तो कस्टम नोटिफिकेशन पोस्ट करने के लिए थोड़ा अलग तरीका होगा (यह एक कस्टम नाम के अलावा है )।
संपादित करें:
मुझे बस एक अलग दृष्टिकोण मिला है जो मुझे लगता है कि बेहतर हो सकता है:
इसमें ऑब्जेक्टिव-सी ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserves/KeyalalueObserves.html#//apple_ref/doc/uid ) का मुख्य-मान अवलोकन (KVO) सुविधा शामिल है / 10000177-बीसीआईसीजेडएचए )।
मूल रूप से, आप खुद को एक संपत्ति के पर्यवेक्षक के रूप में पंजीकृत करते हैं और यदि यह संपत्ति बदलती है तो आपको इसके बारे में सूचित किया जाता है। "सिद्धांत" काफी हद तक इसी तरह 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
है कि टेक्स्ट फ़ील्ड की "टेक्स्ट" संपत्ति टाइप किए गए / हटाए गए प्रत्येक नए पत्र के साथ अपडेट नहीं की गई है। इसके बजाय, पाठ फ़ील्ड ऑब्जेक्ट को "संपूर्ण रूप से" अपडेट किया जाता है, जब आप पाठ फ़ील्ड के पहले उत्तरदाता की स्थिति से इस्तीफा दे देते हैं।