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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন