Responder Chain एक iOS तंत्र है जो स्पर्श, कुंजी दबाव और जेस्चर ईवेंट को UIResponder ऑब्जेक्ट्स के पदानुक्रम के माध्यम से क्रमिक रूप से तब तक प्रेषित करता है जब तक उनमें से कोई ईवेंट को हैंडल नहीं करता। श्रृंखला उस ऑब्जेक्ट से शुरू होती है जिसने ईवेंट का पता लगाया और पदानुक्रम में ऊपर की ओर बढ़ती है: व्यू से उसके सुपरव्यू तक, फिर व्यू कंट्रोलर, विंडो और अंत में UIApplication तक। Apple Developer Documentation (2026) के अनुसार, यह पैटर्न ईवेंट हैंडलिंग की जिम्मेदारी को इंटरफ़ेस घटकों के बीच विभाजित करने की अनुमति देता है, जो किसी विशिष्ट हैंडलर से कठोर जुड़ाव के बिना लचीलापन प्रदान करता है।
मुख्य बिंदु
Responder Chain UIResponder ऑब्जेक्ट्स का एक अनुक्रम है जिसके माध्यम से iOS स्पर्श, कुंजी दबाव और एक्सेलेरोमीटर डेटा जैसी इनपुट घटनाओं को प्रेषित करता है। इस श्रृंखला में प्रत्येक ऑब्जेक्ट के पास ईवेंट को हैंडल करने या next प्रॉपर्टी के माध्यमसे अगले प्रतिक्रियाकर्ता ऑब्जेक्ट को प्रेषित करने की क्षमता होती है।
तंत्र व्यू पदानुक्रम पर आधारित है: जब कोई स्पर्श होता है, iOS पहले यह निर्धारित करता है कि कौन सा व्यू छुआ गया था (hit-testing के माध्यम से) और उस व्यू से शुरू होकर UIApplication तक एक श्रृंखला बनाता है। UIApplication श्रृंखला की अंतिम कड़ी है — यदि कोई ईवेंट उस तक पहुँचता है और हैंडल नहीं किया जाता है, तो इसे छोड़ दिया जाता है।
Apple के अनुसार, यह पैटर्न ईवेंट हैंडलिंग लॉजिक को एनकैप्सुलेट करने के लिए महत्वपूर्ण है। डेवलपर पदानुक्रम में अन्य तत्वों को प्रभावित किए बिना किसी विशिष्ट व्यू के व्यवहार को ओवरराइड कर सकता है। उदाहरण के लिए, UITextField फ़ोकस प्राप्त करने पर पहला प्रतिक्रियाकर्ता बन जाता है और पैरेंट UIViewController में बदलाव की आवश्यकता के बिना कीबोर्ड ईवेंट प्राप्त करता है।
ईवेंट हैंडलिंग Responder Chain के माध्यम से दो चरणों में होती है: पहले, iOS यह निर्धारित करता है कि किस व्यू ने ईवेंट प्राप्त किया (hit-testing), फिर इसे हैंडल करने के लिए प्रतिक्रियाकर्ता श्रृंखला चलाता है। यदि कोई ऑब्जेक्ट संबंधित विधि को लागू नहीं करता है, तो ईवेंट आगे प्रेषित हो जाता है।
श्रृंखला वर्तमान पहले प्रतिक्रियाकर्ता और व्यू पदानुक्रम के आधार पर गतिशील रूप से बनती है। मानक क्रम है: पहला प्रतिक्रियाकर्ता → उसका व्यू → सुपरव्यू → UIViewController → रूट व्यू → UIWindow → UIApplication। यदि इनमें से कोई भी ऑब्जेक्ट उदाहरण के लिए touchesBegan लागू करता है, तो ईवेंट उस स्तर पर हैंडल होता है और आगे प्रेषित नहीं होता।
import UIKit
class CustomView: UIView {
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
// इस व्यू स्तर पर स्पर्श हैंडल किया गया
print("CustomView ने स्पर्श हैंडल किया")
// श्रृंखला के साथ ईवेंट अग्रेषित करें
super.touchesBegan(touches, with: event)
}
}
एक महत्वपूर्ण विशेषता यह है कि super.touchesBegan को कॉल करना अनिवार्य नहीं है। यदि इसे कॉल नहीं किया जाता है, तो ईवेंट केवल वर्तमान स्तर पर हैंडल किया जाएगा और Responder Chain में आगे नहीं जाएगा। यह डेवलपर को पूर्ण नियंत्रण देता है कि कौन से ऑब्जेक्ट हैंडलिंग में भाग लेते हैं।
जब कोई ऑब्जेक्ट ईवेंट प्राप्त करता है लेकिन उसे हैंडल नहीं करता (विधि को ओवरराइड नहीं करता), iOS स्वचालित रूप से next प्रॉपर्टी के माध्यम से ईवेंट को अगले प्रतिक्रियाकर्ता ऑब्जेक्ट को प्रेषित करता है। यह प्रॉपर्टी एक एकल-लिंक्ड सूची बनाती है, जिसे Responder Chain कहा जाता है।
UIViewController अपने व्यू और UIWindow के बीच स्थित होता है: यदि व्यू ईवेंट हैंडल नहीं करता है, तो कंट्रोलर को ऐसा करने का अवसर मिलता है। यह सामान्य लॉजिक के लिए विशेष रूप से उपयोगी है — उदाहरण के लिए, एक जेस्चर को हैंडल करना जो पूरे दृश्य पर काम करना चाहिए, भले ही उपयोगकर्ता की उंगली के नीचे कौन सा व्यू हो।
Hit-Testing वह प्रक्रिया है जिसके द्वारा iOS यह निर्धारित करता है कि स्पर्श बिंदु के नीचे कौन सा व्यू है। hitTest:withEvent: विधि UIWindow से नीचे की ओर व्यू पदानुक्रम को पार करती है, यह जाँचती है कि कौन सा चाइल्ड व्यू स्पर्श बिंदु को समाहित करता है और छिपा नहीं है।
एल्गोरिदम पुनरावृत्त रूप से काम करता है: प्रत्येक स्तर के लिए, iOS जोड़ने के विपरीत क्रम में व्यू की जाँच करता है (पहले सबसे ऊपर वाला)। यदि कोई व्यू छिपा नहीं है, पारदर्शी नहीं है और बिंदु उसकी सीमा के अंदर आता है, तो उसके सभी उप-व्यू के लिए पुनरावृत्त रूप से hitTest चलाया जाता है। सबसे गहरा व्यू जो सभी शर्तों को पूरा करता है वह hit-test व्यू बन जाता है — Responder Chain में पहला ऑब्जेक्ट।
override func hitTest(
_ point: CGPoint,
with event: UIEvent?
) -> UIView? {
if isUserInteractionEnabled &&
isHidden == false &&
alpha > 0.01 &&
point(inside: point, with: event) {
return super.hitTest(point, with: event)
}
return nil
}
डेवलपर डिफ़ॉल्ट व्यवहार को बदलने के लिए hitTest को ओवरराइड कर सकते हैं। उदाहरण के लिए, एक छोटे बटन के लिए स्पर्श क्षेत्र बढ़ाने या ईवेंट को किसी अन्य व्यू पर रीडायरेक्ट करने के लिए जो शारीरिक रूप से उंगली के नीचे नहीं है। यह कस्टम इंटरैक्टिव तत्व बनाने के लिए एक शक्तिशाली उपकरण है।
UIResponder iOS में सभी ऑब्जेक्ट्स के लिए आधार वर्ग है जो ईवेंट को हैंडल कर सकते हैं। UIView, UIViewController, UIApplication और UIWindow UIResponder से विरासत प्राप्त करते हैं। यह वर्ग विभिन्न प्रकार के ईवेंट को हैंडल करने के लिए ओवरराइड की जा सकने वाली विधियों का एक सेट प्रदान करता है।
मुख्य विधि समूहों में स्पर्श के लिए touchesBegan, touchesMoved, touchesEnded, touchesCancelled शामिल हैं; भौतिक बटन के लिए pressesBegan, pressesEnded; और एक्सेलेरोमीटर ईवेंट के लिए motionBegan, motionEnded। प्रत्येक विधि UITouch या UIPress ऑब्जेक्ट्स का एक सेट और ईवेंट के बारे में अतिरिक्त मेटाडेटा वाले UIEvent का संदर्भ प्राप्त करती है।
| UIResponder विधि | उद्देश्य |
|---|---|
| touchesBegan | स्पर्श शुरू होने पर कॉल किया जाता है |
| touchesMoved | उंगली हिलाने पर कॉल किया जाता है |
| touchesEnded | उंगली उठाने पर कॉल किया जाता है |
| touchesCancelled | व्यवधान पर कॉल किया जाता है (कॉल, कंट्रोल सेंटर स्वाइप) |
| pressesBegan | भौतिक बटन दबाने पर कॉल किया जाता है |
यह समझना महत्वपूर्ण है कि iOS इन विधियों को केवल पहले प्रतिक्रियाकर्ता और श्रृंखला में बाद के ऑब्जेक्ट्स के लिए कॉल करता है। यदि किसी ऑब्जेक्ट ने विधि को ओवरराइड नहीं किया है, तो ईवेंट कोई त्रुटि उत्पन्न नहीं करता — इसे केवल अनदेखा किया जाता है। ईवेंट हैंडलिंग को डीबग करने के लिए, UIResponder touchEvent पर Symbolic Breakpoint का उपयोग करें।
मानक UIKit घटक अपने संचालन के लिए सक्रिय रूप से Responder Chain का उपयोग करते हैं। UITextField फ़ोकस प्राप्त करने पर पहला प्रतिक्रियाकर्ता बन जाता है, जो स्वचालित रूप से कीबोर्ड खोलता है। UIButton UIControl तंत्र के माध्यम से स्पर्श को हैंडल करता है, जो प्रतिक्रियाकर्ता श्रृंखला पर भी निर्भर करता है।
UITableView और UICollectionView सेल चयन और स्क्रॉल जेस्चर को हैंडल करने के लिए प्रतिक्रियाकर्ता श्रृंखला का उपयोग करते हैं। यदि उपयोगकर्ता किसी सेल को छूता है, तो ईवेंट पहले सेल तक, फिर UITableView तक, और उसके बाद ही UIViewController तक पहुँचता है। UIGestureRecognizer की touchesBegan से अधिक प्राथमिकता होती है — यदि किसी व्यू में जेस्चर पहचानकर्ता जोड़ा गया है, तो वह पहले ईवेंट प्राप्त करेगा।
Apple के अनुसार, Responder Chain का सही उपयोग ऐप एक्सेसिबिलिटी के लिए महत्वपूर्ण है। VoiceOver और अन्य सहायक प्रौद्योगिकियाँ इंटरफ़ेस तत्वों के बीच नेविगेट करने के लिए प्रतिक्रियाकर्ता श्रृंखला का उपयोग करती हैं। यदि श्रृंखला टूट गई है, तो विकलांग उपयोगकर्ता एप्लिकेशन के साथ बातचीत नहीं कर पाएंगे।
UIMenuController संदर्भ मेनू प्रदर्शित करने के लिए भी Responder Chain का उपयोग करता है। जब उपयोगकर्ता मेनू को कॉल करता है, सिस्टम एक पहला प्रतिक्रियाकर्ता खोजता है जो canPerformAction और संबंधित कार्रवाई विधियों को लागू करता है। मेनू केवल उन क्रियाओं के लिए प्रदर्शित होता है जो वर्तमान प्रतिक्रियाकर्ता समर्थन करता है।
यह उदाहरण के लिए, कट, कॉपी, पेस्ट कमांड को केवल तब दिखाने की अनुमति देता है जब UITextField फ़ोकस में हो, और UILabel के साथ काम करते समय उन्हें छिपाने की। डेवलपर UIResponder के उपवर्ग में उन्हें लागू करके और canPerformAction से true लौटाकर संदर्भ मेनू में कस्टम क्रियाएँ जोड़ सकता है।
कस्टम प्रतिक्रियाकर्ता ऑब्जेक्ट बनाना डेवलपर को ईवेंट हैंडलिंग पर पूर्ण नियंत्रण देता है। ऐसा करने के लिए, आपको UIResponder (या UIView/UIViewController) का एक उपवर्ग बनाना होगा और आवश्यक ईवेंट हैंडलिंग विधियों को ओवरराइड करना होगा।
कस्टम प्रतिक्रियाकर्ता ऑब्जेक्ट अक्सर विशिष्ट जेस्चर को हैंडल करने के लिए उपयोग किए जाते हैं जो मानक UIGestureRecognizer द्वारा कवर नहीं होते हैं। उदाहरण के लिए, आकृति ड्राइंग पहचानना, जटिल मल्टी-टच संयोजन या मालिकाना इनपुट पैटर्न। एक कस्टम प्रतिक्रियाकर्ता कई उंगलियों से ईवेंट एकत्र कर सकता है और उनके संयोजन के आधार पर निर्णय ले सकता है।
class DrawingResponder: UIResponder {
private var activeTouches: [UITouch: CGPoint] = [:]
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
for touch in touches {
activeTouches[touch] = touch.location(in: self)
}
}
override func touchesMoved(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
for touch in touches {
let currentPoint = touch.location(in: self)
activeTouches[touch] = currentPoint
drawLine(from: activeTouches[touch]!, to: currentPoint)
}
}
}
कस्टम प्रतिक्रियाकर्ता बनाते समय, next श्रृंखला को सही ढंग से कॉन्फ़िगर करना महत्वपूर्ण है। यदि आपका ऑब्जेक्ट मानक UIKit पदानुक्रम का हिस्सा नहीं है, तो आपको स्पष्ट रूप से निर्दिष्ट करना होगा कि कौन सा ऑब्जेक्ट इसका अगला प्रतिक्रियाकर्ता होगा। यह सुनिश्चित करता है कि अनहैंडल ईवेंट Responder Chain के साथ आगे बढ़ते रहें।
अक्सर पूछे जाने वाले प्रश्न
Responder Chain UIResponder ऑब्जेक्ट्स की एक पदानुक्रमित श्रृंखला है जिसके माध्यम से iOS क्रमिक रूप से स्पर्श, दबाव और जेस्चर ईवेंट प्रेषित करता है। यदि कोई ऑब्जेक्ट ईवेंट हैंडल नहीं करता है, तो इसे श्रृंखला में अगले प्रतिक्रियाकर्ता ऑब्जेक्ट को UIApplication तक प्रेषित किया जाता है।
आप अपने UIResponder ऑब्जेक्ट की next प्रॉपर्टी को ओवरराइड करके क्रम बदल सकते हैं। डिफ़ॉल्ट के बजाय एक अलग ऑब्जेक्ट लौटाकर, आप अनहैंडल ईवेंट को उस पर रीडायरेक्ट करते हैं। यह गैर-मानक पदानुक्रमों के लिए उपयोगी है, उदाहरण के लिए, जब कोई कस्टम कंटेनर कई चाइल्ड कंट्रोलर प्रबंधित करता है।
Hit-Testing यह निर्धारित करता है कि स्पर्श बिंदु के नीचे कौन सा व्यू है (प्रारंभिक प्राप्तकर्ता), जबकि Responder Chain यह निर्धारित करता है कि hit-test के बाद ईवेंट ऑब्जेक्ट्स के बीच कैसे प्रेषित होता है। Hit-test पहला ऑब्जेक्ट ढूँढता है, प्रतिक्रियाकर्ता श्रृंखला आगे रूटिंग प्रदान करती है यदि वह ऑब्जेक्ट ईवेंट हैंडल नहीं करता है।
श्रृंखला को तोड़ने के लिए, अपने UIResponder में ईवेंट हैंडल करें और super को कॉल न करें। उदाहरण के लिए, touchesBegan को ओवरराइड करके और super.touchesBegan को कॉल न करके, आप ईवेंट को आगे प्रेषित होने से रोकते हैं। ईवेंट वर्तमान स्तर पर हैंडल किया जाएगा और श्रृंखला की अगली कड़ियों तक नहीं पहुँचेगा।
सबसे सामान्य कारण: isUserInteractionEnabled false पर सेट है, व्यू छिपा है (isHidden = true), alpha 0.01 से कम है, या व्यू पैरेंट कंटेनर की सीमा से बाहर है। यह भी जाँचें कि व्यू या उसके सुपरव्यू पर कोई UIGestureRecognizer तो नहीं है जो touchesBegan से पहले ईवेंट को इंटरसेप्ट करता हो।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें