UITextField text change event: हर अक्षर मायने रखता है
\n\nसोचिए: आप एक नोट्स ऐप, कैटलॉग सर्च या मैसेजिंग ऐप बना रहे हैं। यूज़र UITextField में टाइप करना शुरू करता है, और आपको तुरंत रिएक्ट करना होता है — सुझाव दिखाने हों, बचे हुए अक्षर गिनने हों, या सर्वर पर रिक्वेस्ट भेजनी हो। टेक्स्ट बदलने के इस पल को कैसे पकड़ें? यह सवाल नए और अनुभवी iOS डेवलपर्स दोनों को परेशान करता है। Stack Overflow पर UITextField text change event टॉपिक ने हज़ारों व्यूज़ जुटाए हैं — और यह कोई संयोग नहीं है।
iOS डेवलपमेंट में कम से कम तीन काम के तरीके हैं। और गलत तरीका चुनने पर आपको बग्स, मेमोरी लीक या 100 लाइनों का अनावश्यक कोड झेलना पड़ सकता है। आज हम UITextField में टेक्स्ट बदलाव को ट्रैक करने के सभी तरीकों को विस्तार से समझेंगे: क्लासिक Delegate से लेकर आधुनिक Combine तक। चलिए शुरू करते हैं!
\n\nसिर्फ बटन दबाना क्यों काफी नहीं है?
\n\nलगता है क्या मुश्किल है? यूज़र ने टेक्स्ट डाला — "Done" या "Search" बटन दबाया। लेकिन आधुनिक इंटरफ़ेस में रियल-टाइम रिएक्शन चाहिए। ये हैं कुछ सामान्य परिदृश्य:
\n- \n
- ऑटोकम्पलीट (search as you type) — हर की प्रेस पर सुझाव दिखते हैं। \n
- लाइव वैलिडेशन — फॉर्म सबमिट किए बिना ईमेल या फ़ोन नंबर चेक करना। \n
- कैरेक्टर काउंटर — जैसे Twitter क्लाइंट में बताना कि लिमिट तक कितने अक्षर बचे हैं। \n
- डायनामिक सर्च — कॉन्टैक्ट्स या प्रोडक्ट्स की लिस्ट को फ़िल्टर करना। \n
इन सभी मामलों में हमें UITextField text change event चाहिए। और अब सवाल यह है: Swift में इसे सही तरीके से कैसे लागू करें?
तरीका 1: UITextFieldDelegate — क्लासिक और भरोसेमंद
\n\nसबसे सीधा और शायद सबसे लोकप्रिय तरीका। आप अपने टेक्स्ट फील्ड को एक डेलिगेट असाइन करते हैं और textField(_:shouldChangeCharactersIn:replacementString:) मेथड को इम्प्लीमेंट करते हैं। लेकिन एक बारीकी है: यह मेथड टेक्स्ट बदलने से पहले कॉल होता है। यह पूछता है: "क्या यह अक्षर डाला जा सकता है?"
असल टेक्स्ट पाने के लिए, आपको इसे मैन्युअली बनाना होगा:
\n\nclass ViewController: UIViewController, UITextFieldDelegate {\n \n @IBOutlet weak var textField: UITextField!\n \n override func viewDidLoad() {\n super.viewDidLoad()\n textField.delegate = self\n }\n \n func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n let currentText = textField.text ?? ""\n guard let stringRange = Range(range, in: currentText) else { return false }\n let updatedText = currentText.replacingCharacters(in: stringRange, with: string)\n \n print("नया टेक्स्ट: \\(updatedText)")\n // यहाँ UI अपडेट करें या सर्च शुरू करें\n return true\n }\n}\n\n\nफायदे:
\n- \n
- इनपुट पर पूरा नियंत्रण — कुछ अक्षरों को रोका जा सकता है। \n
- iOS के सभी वर्ज़न पर काम करता है। \n
नुकसान:
\n- \n
- सिर्फ "बदलाव पकड़ने" के लिए कोड बहुत बड़ा है। \n
NSRangeऔरRange<String.Index>में कन्वर्ट करना याद रखना पड़ता है। \n - प्रोग्रामेटिक रूप से
textField.text = "नया टेक्स्ट"सेट करने पर काम नहीं करता। \n
यह तरीका तब बढ़िया है जब आपको इनपुट वैलिडेट करना हो (जैसे फ़ोन नंबर फील्ड में अक्षर रोकना)। लेकिन सिर्फ बदलाव ट्रैक करने के लिए इससे अच्छे विकल्प हैं।
\n\nतरीका 2: Target-Action (UIControl.Event.editingChanged) — सरल और भरोसेमंद
\n\nदूसरा तरीका है .editingChanged इवेंट के लिए टार्गेट और एक्शन जोड़ना। यह टेक्स्ट बदलने के बाद कॉल होता है, और कोड बहुत साफ-सुथरा दिखता है: