समझने के delegates
लिए समझना होगा protocols
।
A protocol
सेवा अनुबंध की तरह है। जब कोई वस्तु (सबसे अधिक बार एक UIViewController
उपवर्ग, लेकिन हमेशा नहीं) उस अनुबंध पर हस्ताक्षर करती है, तो यह कह रही है कि "मुझे आपके द्वारा भेजे गए संदेश को वापस करने के लिए तर्क प्रदान करने में दिलचस्पी है"। यह NSNotificationCenter
ब्याज के एक स्तर के लिए साइन अप करने के संबंध में समान है , अंतर जो एक प्रतिनिधि के रूप में कार्यरत है, वह केवल delegate
एक समय में एक हो सकता है, जहां कई ऑब्जेक्ट समान के लिए साइन अप कर सकते हैं NSNotification
।
Apple प्रतिनिधिमंडल का व्यापक रूप से उपयोग करता है। अधिक से अधिक, हालांकि, आप देख रहे हैं कि Apple अपने API को बहुत अधिक स्थानांतरित कर रहा है blocks
, जो callbacks
अन्य भाषाओं में समान हैं।
कहा जा रहा है कि, प्रतिनिधिमंडल एमवीसी को बनाए रखने में मदद करता है, भले ही मैं तर्क देता हूं कि प्रतिनिधिमंडल अपने आप में एक डिजाइन पैटर्न है। यह मॉडल को नियंत्रकों से अलग करने में मदद करता है। जैसे जॉन कार्टराईट के उदाहरण में, UITableView
पंक्तियों और अनुभागों को प्रदर्शित करना जानता है। यह जानता है कि UITableViewCells
प्रदर्शन कारणों के लिए पुन: उपयोग कैसे किया जाए । यह सभी अन्य सामानों को UIScrollView
जानता है। लेकिन यह पता नहीं है कि कौन से सेल प्रदर्शित करने हैं। यह पता नहीं है कि उन कोशिकाओं को किसके साथ जोड़ना है। यह पता नहीं है कि कौन सी कोशिकाएं किसी दिए के लिए पुन: उपयोग करती हैं NSIndexPath
। यह वास्तव में नियंत्रक, वैसे भी का काम होना चाहिए। प्रत्यायोजन तालिका दृश्य को इस गैर-दृश्य तर्क को किसी ऑब्जेक्ट पर लोड करने की अनुमति देता है, जो कि उस जिम्मेदारी के पास होना चाहिए।
इससे अधिक, आप किसी वस्तु के पूरे जीवनकाल के लिए एक प्रतिनिधि में बंद नहीं हैं। आप बहुत आसानी से किसी के लिए कई डेटा स्रोत हो सकते हैं UITableView
और उन्हें आवश्यकतानुसार रन टाइम पर स्विच कर सकते हैं।
तो, एक ओर, प्रतिनिधिमंडल किसी वस्तु से बातचीत के लिए डेटा की आपूर्ति और प्रतिक्रिया देने के लिए महान है। आप UIKit कक्षाएं, इस तरह के एक का एक बहुत में यह देखेंगे UITableView
, UIPickerView
, UICollectionView
, आदि
लेकिन जब आप वस्तुओं के बीच जानकारी पास करना चाहते हैं तो प्रतिनिधिमंडल बहुत उपयोगी है। आप आसानी से अपने स्वयं के प्रोटोकॉल बना सकते हैं और उनका अनुसरण करने के लिए अपनी खुद की वस्तुओं को साइन अप कर सकते हैं। इसके अलावा, प्रोटोकॉल विधियां @required
डिफ़ॉल्ट रूप से होती हैं, लेकिन आप कुछ तरीकों को निर्दिष्ट कर सकते हैं@optional
। यदि आपको आवश्यकता हो तो यह आपको कुछ अच्छा लचीलापन दे सकता है। मान लीजिए कि आपके पास एक पेरेंट व्यू कंट्रोलर और एक चाइल्ड व्यू कंट्रोलर है। हो सकता है कि आप ऐसा करने के लिए नए कंटेनर API का उपयोग कर रहे हों। आमतौर पर, यदि आपको माता-पिता से बच्चे को जानकारी देने की आवश्यकता है, तो आप एक संपत्ति के साथ ऐसा करते हैं। किया हुआ। लेकिन क्या होगा अगर आपको बच्चे से वापस माता-पिता को जानकारी देने की आवश्यकता है? हो सकता है कि बच्चे में कुछ बदलाव आए और आपको माता-पिता को सूचित करना होगा। निश्चित रूप से, आप कुछ मूल्यों पर कुछ केवीओ कर सकते हैं। लेकिन शायद आप जानना चाहते हैं कि एक बटन कब दबाया जाता है। बस चाइल्ड व्यू कंट्रोलर में एक नया प्रोटोकॉल बनाएं
@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end
@interface MyChildViewController : UIViewController
@property (weak, nonatomic) id <MyChildDelegate> delegate;
@end
MyChildViewController में, जब आपका बटन टैप किया जाता है, तो जांचें कि क्या आपके प्रतिनिधि ने प्रतिनिधि संदेश का जवाब दिया है (यदि यह आवश्यक है और आपका प्रतिनिधि विधि को लागू नहीं करता है, तो आप क्रैश हो जाएंगे। @optional
यदि आप की जरूरत है तो आप विधि बना सकते हैं और भेज सकते हैं) यह:
- (IBAction)someButtonTapped:(id)sender {
if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
[self.delegate buttonWasTappedInChild:self];
}
}
फिर अपने पैरेंट व्यू कंट्रोलर में अपने MyChildViewController के प्रतिनिधि को सेट करें self
और लागू - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
करें। बूम! आपके पास बच्चे से लेकर माता-पिता तक की जानकारी है। दो वस्तुओं के बीच संबंध को माता-पिता / बच्चे के समान होने की आवश्यकता नहीं है। यह एक सेवा अनुबंध है, इसलिए जब तक हस्ताक्षर करने वाली वस्तु आवश्यक तरीकों को लागू करके सौदेबाजी के अपने अंत को बनाए रखती है, तब तक आप सुनहरे हैं!
नोट: प्रतिनिधि कमजोर / संपत्तियों को निर्दिष्ट करने वाले होने चाहिए, अन्यथा आप एक अनुरक्षण चक्र में प्रवेश करेंगे जहां न तो वस्तु को निपटाया जा सकता है।
उम्मीद है की यह मदद करेगा!