ios - मैं उद्देश्य-सी में प्रतिनिधियों को कैसे बना सकता हूं?




objective-c cocoa (13)

मुझे पता है कि प्रतिनिधि कैसे काम करते हैं, और मुझे पता है कि मैं उनका उपयोग कैसे कर सकता हूं।

लेकिन मैं उन्हें कैसे बना सकता हूं?


स्विफ्ट संस्करण

एक प्रतिनिधि सिर्फ एक वर्ग है जो कुछ अन्य वर्ग के लिए काम करता है। कुछ हद तक मूर्खतापूर्ण (लेकिन उम्मीद है कि प्रबुद्ध) के लिए निम्न कोड पढ़ें, खेल का मैदान उदाहरण यह दिखाता है कि यह स्विफ्ट में कैसे किया जाता है।

// A protocol is just a list of methods (and/or properties) that must
// be used by any class that adopts the protocol.
protocol OlderSiblingDelegate: class {
    // This protocol only defines one required method
    func getYourNiceOlderSiblingAGlassOfWater() -> String
}

class BossyBigBrother {

    // The delegate is the BossyBigBrother's slave. This position can 
    // be assigned later to whoever is available (and conforms to the 
    // protocol).
    weak var delegate: OlderSiblingDelegate?

    func tellSomebodyToGetMeSomeWater() -> String? {
        // The delegate is optional because there might not be anyone
        // nearby to boss around.
        return delegate?.getYourNiceOlderSiblingAGlassOfWater()
    }
}

// PoorLittleSister conforms to the OlderSiblingDelegate protocol
class PoorLittleSister: OlderSiblingDelegate {

    // This method is repquired by the protocol, but the protocol said
    // nothing about how it needs to be implemented.
    func getYourNiceOlderSiblingAGlassOfWater() -> String {
        return "Go get it yourself!"
    }

}

// initialize the classes
let bigBro = BossyBigBrother()
let lilSis = PoorLittleSister()

// Set the delegate 
// bigBro could boss around anyone who conforms to the 
// OlderSiblingDelegate protocol, but since lilSis is here, 
// she is the unlucky choice.
bigBro.delegate = lilSis

// Because the delegate is set, there is a class to do bigBro's work for him.
// bigBro tells lilSis to get him some water.
if let replyFromLilSis = bigBro.tellSomebodyToGetMeSomeWater() {
    print(replyFromLilSis) // "Go get it yourself!"
}

वास्तविक अभ्यास में, प्रतिनिधियों को अक्सर निम्नलिखित स्थितियों में उपयोग किया जाता है

  1. जब किसी वर्ग को किसी अन्य वर्ग को कुछ जानकारी संवाद करने की आवश्यकता होती है
  2. जब कोई वर्ग किसी अन्य वर्ग को इसे अनुकूलित करने की अनुमति देना चाहता है

कक्षाओं को पहले एक दूसरे के बारे में कुछ भी जानने की आवश्यकता नहीं है, सिवाय इसके कि प्रतिनिधि वर्ग आवश्यक प्रोटोकॉल के अनुरूप है।

मैं निम्नलिखित दो लेख पढ़ने की अत्यधिक अनुशंसा करता हूं। उन्होंने documentation तुलना में प्रतिनिधियों को भी बेहतर समझने में मेरी मदद की।


ViewController.h

@protocol NameDelegate <NSObject>

-(void)delegateMEthod: (ArgType) arg;

@end

@property id <NameDelegate> delegate;

ViewController.m

[self.delegate delegateMEthod: argument];

MainViewController.m

ViewController viewController = [ViewController new];
viewController.delegate = self;

तरीका:

-(void)delegateMEthod: (ArgType) arg{
}

अपने स्वयं के प्रतिनिधि बनाने के लिए, सबसे पहले आपको प्रोटोकॉल बनाने और कार्यान्वित किए बिना आवश्यक विधियों की घोषणा करने की आवश्यकता है। और उसके बाद इस प्रोटोकॉल को अपने हेडर क्लास में कार्यान्वित करें जहां आप प्रतिनिधि या प्रतिनिधि विधियों को लागू करना चाहते हैं।

एक प्रोटोकॉल नीचे घोषित किया जाना चाहिए:

@protocol ServiceResponceDelegate <NSObject>

- (void) serviceDidFailWithRequestType:(NSString*)error;
- (void) serviceDidFinishedSucessfully:(NSString*)success;

@end

यह सेवा वर्ग है जहां कुछ कार्य किया जाना चाहिए। यह दिखाता है कि प्रतिनिधि को कैसे परिभाषित किया जाए और प्रतिनिधि को कैसे सेट किया जाए। कार्य पूरा होने के बाद कार्यान्वयन वर्ग में प्रतिनिधि के तरीकों को बुलाया जाता है।

@interface ServiceClass : NSObject
{
id <ServiceResponceDelegate> _delegate;
}

- (void) setDelegate:(id)delegate;
- (void) someTask;

@end

@implementation ServiceClass

- (void) setDelegate:(id)delegate
{
_delegate = delegate;
}

- (void) someTask
{
/*

   perform task

*/
if (!success)
{
[_delegate serviceDidFailWithRequestType:@”task failed”];
}
else
{
[_delegate serviceDidFinishedSucessfully:@”task success”];
}
}
@end

यह मुख्य दृश्य वर्ग है जहां से प्रतिनिधि वर्ग को प्रतिनिधि को स्वयं सेट करके बुलाया जाता है। और हेडर वर्ग में भी प्रोटोकॉल लागू किया गया है।

@interface viewController: UIViewController <ServiceResponceDelegate>
{
ServiceClass* _service;
}

- (void) go;

@end

@implementation viewController

//
//some methods
//

- (void) go
{
_service = [[ServiceClass alloc] init];
[_service setDelegate:self];
[_service someTask];
}

यही वह है, और इस वर्ग में प्रतिनिधि विधियों को लागू करके, ऑपरेशन / कार्य पूरा हो जाने पर नियंत्रण वापस आ जाएगा।


अस्वीकरण: यह एक delegate बनाने के लिए Swift संस्करण है।

तो, प्रतिनिधियों क्या हैं? ... सॉफ्टवेयर विकास में, सामान्य पुन: प्रयोज्य समाधान आर्किटेक्चर हैं जो किसी दिए गए संदर्भ में सामान्य रूप से होने वाली समस्याओं को हल करने में मदद करते हैं, इसलिए इन "टेम्पलेट्स" को बोलने के लिए सबसे अच्छा डिजाइन पैटर्न के रूप में जाना जाता है। प्रतिनिधि एक डिज़ाइन पैटर्न होते हैं जो एक ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट पर संदेश भेजने की अनुमति देता है जब कोई विशिष्ट घटना होती है। एक ऑब्जेक्ट की कल्पना करें ए ए ऑब्जेक्ट बी को एक्शन करने के लिए कॉल करता है। एक बार कार्रवाई पूरी होने के बाद, वस्तु ए को पता होना चाहिए कि बी ने कार्य पूरा कर लिया है और आवश्यक कार्रवाई कर ली है, इसे प्रतिनिधियों की मदद से हासिल किया जा सकता है!

एक बेहतर स्पष्टीकरण के लिए, मैं आपको एक कस्टम प्रतिनिधि बनाने का तरीका दिखाऊंगा जो कक्षाओं के बीच डेटा को पास करता है, स्विफ्ट के साथ एक साधारण एप्लिकेशन में, इस स्टार्टर प्रोजेक्ट को डाउनलोड या क्लोन करके शुरू करें और इसे चलाएं!

आप दो कक्षाओं, ViewController A और ViewController B साथ एक ऐप देख सकते हैं। बी में दो विचार हैं कि टैप पर ViewController का पृष्ठभूमि रंग बदलता है, कुछ भी जटिल नहीं है? अच्छी तरह से कक्षा ए के पृष्ठभूमि रंग को बदलने के एक आसान तरीके से सोचें जब कक्षा बी के विचार टैप किए जाते हैं।

समस्या यह है कि यह विचार कक्षा बी का हिस्सा हैं और कक्षा ए के बारे में कोई जानकारी नहीं है, इसलिए हमें इन दो वर्गों के बीच संवाद करने का एक तरीका ढूंढना होगा, और यही वह जगह है जहां प्रतिनिधिमंडल चमकता है। मैंने कार्यान्वयन को 6 चरणों में विभाजित किया ताकि आप इसे धोखाधड़ी के रूप में उपयोग कर सकें जब आपको इसकी आवश्यकता हो।

चरण 1: क्लासबीवीसी फ़ाइल में प्रोगमा मार्क चरण 1 की तलाश करें और इसे जोड़ें

//MARK: step 1 Add Protocol here.
protocol ClassBVCDelegate: class {
func changeBackgroundColor(_ color: UIColor?)
}

पहला कदम एक protocol बनाना है, इस मामले में, हम प्रोटोकॉल के अंदर कक्षा बी में प्रोटोकॉल बनाएंगे, आप अपने कार्यान्वयन की आवश्यकताओं के आधार पर जितना चाहें उतने कार्यों को बना सकते हैं। इस मामले में, हमारे पास एक साधारण कार्य है जो एक वैकल्पिक UIColor को तर्क के रूप में स्वीकार करता है। कक्षा के नाम के अंत में delegate को जोड़ने वाले प्रोटोकॉल को नाम देने का एक अच्छा अभ्यास है, इस मामले में, ClassBVCDelegate

चरण 2: ClassVBC में ClassVBC चिह्न चरण 2 की ClassVBC और इसे जोड़ें

//MARK: step 2 Create a delegate property here.
weak var delegate: ClassBVCDelegate?

यहां हम कक्षा के लिए सिर्फ एक प्रतिनिधि संपत्ति बनाते हैं, इस संपत्ति को protocol प्रकार को अपनाना होगा, और यह वैकल्पिक होना चाहिए। साथ ही, आपको चक्र से पहले कमजोर कीवर्ड जोड़ना चाहिए ताकि चक्र और संभावित मेमोरी लीक बनाए रखने से बच सकें, अगर आपको नहीं पता कि इसका मतलब क्या है, तो अभी चिंता न करें, बस इस कीवर्ड को जोड़ना याद रखें।

चरण 3: क्लासबीवीसी में हैंडलटैप method अंदर प्रगमा चिह्न चरण 3 की ClassBVC और इसे जोड़ें

//MARK: step 3 Add the delegate method call here.
delegate?.changeBackgroundColor(tapGesture.view?.backgroundColor)

एक चीज जो आपको जाननी चाहिए, ऐप चलाएं और किसी भी दृश्य पर टैप करें, आपको कोई नया व्यवहार नहीं दिखाई देगा और यह सही है, लेकिन जिस चीज को मैं इंगित करना चाहता हूं वह यह है कि जब प्रतिनिधि को कॉल किया जाता है तो ऐप क्रैश नहीं होता है, और ऐसा इसलिए है क्योंकि हम इसे एक वैकल्पिक मान के रूप में बनाते हैं और यही कारण है कि यह भी दुर्घटनाग्रस्त नहीं होगा प्रतिनिधिमंडल अभी तक मौजूद नहीं है। आइए अब ClassAVC फाइल पर जाएं और इसे प्रतिनिधि बनाएं।

चरण 4: क्लासएवीसी में हैंडलटैप विधि के अंदर प्रोगमा मार्क चरण 4 की ClassAVC और इसे अपने क्लास प्रकार के आगे इस तरह जोड़ें।

//MARK: step 4 conform the protocol here.
class ClassAVC: UIViewController, ClassBVCDelegate {
}

अब क्लासएवीवी ने ClassBVCDelegate प्रोटोकॉल को अपनाया है, आप देख सकते हैं कि आपका कंपाइलर आपको एक त्रुटि दे रहा है जो कहता है कि "टाइप" क्लासएवीसी प्रोटोकॉल 'क्लासबीवीसीडीएगेट' के अनुरूप नहीं है और इसका मतलब यह है कि आपने अभी तक प्रोटोकॉल के तरीकों का उपयोग नहीं किया है, कल्पना करें जब कक्षा ए प्रोटोकॉल को गोद लेता है तो कक्षा बी के साथ अनुबंध पर हस्ताक्षर करना है और यह अनुबंध कहता है "मुझे अपनाए जाने वाले किसी भी वर्ग को मेरे कार्यों का उपयोग करना चाहिए!"

त्वरित नोट: यदि आप किसी Objective-C पृष्ठभूमि से आते हैं तो आप शायद सोच रहे हैं कि आप उस विधि को वैकल्पिक बनाने के लिए उस त्रुटि को भी बंद कर सकते हैं, लेकिन मेरे आश्चर्य के लिए, और शायद आपकी, Swift भाषा वैकल्पिक protocols समर्थन नहीं करती protocols , अगर आप चाहें ऐसा करें कि आप अपने protocol लिए एक एक्सटेंशन बना सकते हैं या अपने protocol कार्यान्वयन में @objc कीवर्ड का उपयोग कर सकते हैं।

निजी तौर पर, यदि मुझे विभिन्न वैकल्पिक तरीकों से प्रोटोकॉल बनाना है, तो मैं इसे विभिन्न protocols में तोड़ना पसंद करूंगा, इस तरह मैं अपनी वस्तुओं को एक ही जिम्मेदारी देने की अवधारणा का पालन करूंगा, लेकिन यह विशिष्ट कार्यान्वयन के आधार पर भिन्न हो सकता है।

यहां वैकल्पिक तरीकों के बारे में एक अच्छा लेख है।

चरण 5: सेगू विधि के लिए तैयार के अंदर प्रगमा चिह्न चरण 5 की तलाश करें और इसे जोड़ें

//MARK: step 5 create a reference of Class B and bind them through the `prepareforsegue` method.
if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? ClassBVC {
classBVC.delegate = self
}

यहां हम केवल ClassBVC का एक उदाहरण बना रहे हैं और अपने प्रतिनिधि को स्वयं को सौंप सकते हैं, लेकिन यहां स्वयं क्या है? अच्छा, स्वयं ClassAVC जिसे प्रतिनिधिमंडल दिया गया है!

चरण 6: आखिरकार, ClassAVC में ClassAVC चरण 6 की ClassAVC और चलिए protocol के कार्यों का उपयोग करें, func change टाइप करना शुरू करें बैकग्राउंड रंग और आप देखेंगे कि यह आपके लिए स्वतः पूर्ण हो रहा है। आप इसके अंदर कोई कार्यान्वयन जोड़ सकते हैं, इस उदाहरण में, हम केवल पृष्ठभूमि रंग बदल देंगे, इसे जोड़ें।

//MARK: step 6 finally use the method of the contract
func changeBackgroundColor(_ color: UIColor?) {
view.backgroundColor = color
}

अब ऐप चलाएं!

Delegates हर जगह हैं और आप शायद उन्हें बिना किसी सूचना के इस्तेमाल करते हैं, अगर आप अतीत में एक UIKIT बनाते हैं तो आप प्रतिनिधिमंडल का इस्तेमाल करते हैं, UIKIT कई वर्ग उनके आसपास काम करते हैं और कई अन्य frameworks भी काम करते हैं, वे इन मुख्य समस्याओं को हल करते हैं।

  • वस्तुओं के तंग युग्मन से बचें।
  • ऑब्जेक्ट्स को उप-वर्ग की आवश्यकता के बिना व्यवहार और उपस्थिति को संशोधित करें।
  • किसी भी मनमानी वस्तु को कार्यों को संभालने की अनुमति दें।

बधाई हो, आप सिर्फ एक कस्टम प्रतिनिधि को लागू करते हैं, मुझे पता है कि आप शायद सोच रहे हैं, इस के लिए इतना परेशानी है? अच्छा, प्रतिनिधिमंडल यह समझने के लिए एक बहुत ही महत्वपूर्ण डिजाइन पैटर्न है कि आप iOS डेवलपर बनना चाहते हैं, और हमेशा ध्यान रखें कि उनके पास वस्तुओं के बीच एक से एक संबंध है।

आप here मूल ट्यूटोरियल देख सकते हैं


कृप्या! आईओएस में प्रतिनिधि कैसे काम करता है यह समझने के लिए चरणबद्ध ट्यूटोरियल द्वारा सरल चरण नीचे देखें।

आईओएस में प्रतिनिधि

मैंने दो व्यू कंट्रोलर बनाए हैं (एक से दूसरे डेटा भेजने के लिए)

  1. FirstViewController प्रतिनिधि को लागू करें (जो डेटा प्रदान करता है)।
  2. SecondViewController प्रतिनिधि को घोषित करें (जो डेटा प्राप्त करेगा)।

ठीक है, यह वास्तव में प्रश्न का उत्तर नहीं है, लेकिन यदि आप देख रहे हैं कि अपना खुद का प्रतिनिधि कैसे बनाया जाए तो शायद आपके लिए कुछ बेहतर आसान हो सकता है।

मैं शायद ही कभी अपने प्रतिनिधियों को लागू करता हूं क्योंकि मुझे शायद ही कभी आवश्यकता है। मेरे पास एक प्रतिनिधि वस्तु के लिए केवल एक प्रतिनिधि हो सकता है। इसलिए यदि आप अपने प्रतिनिधि को एक तरह से संचार / उत्तीर्ण डेटा के लिए चाहते हैं, तो आप अधिसूचनाओं के साथ बेहतर हैं।

NSNotification ऑब्जेक्ट्स को एक से अधिक प्राप्तकर्ताओं को पास कर सकता है और इसका उपयोग करना बहुत आसान है। यह इस तरह काम करता है:

MyClass.m फ़ाइल इस तरह दिखनी चाहिए

#import "MyClass.h"
@implementation MyClass 

- (void) myMethodToDoStuff {
//this will post a notification with myClassData (NSArray in this case)  in its userInfo dict and self as an object
[[NSNotificationCenter defaultCenter] postNotificationName:@"myClassUpdatedData"
                                                    object:self
                                                  userInfo:[NSDictionary dictionaryWithObject:selectedLocation[@"myClassData"] forKey:@"myClassData"]];
}
@end

किसी अन्य वर्ग में अपनी अधिसूचना का उपयोग करने के लिए: कक्षा को पर्यवेक्षक के रूप में जोड़ें:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(otherClassUpdatedItsData:) name:@"myClassUpdatedData" object:nil];

चयनकर्ता को लागू करें:

- (void) otherClassUpdatedItsData:(NSNotification *)note {
    NSLog(@"*** Other class updated its data ***");
    MyClass *otherClass = [note object];  //the object itself, you can call back any selector if you want
    NSArray *otherClassData = [note userInfo][@"myClassData"]; //get myClass data object and do whatever you want with it
}

यदि आपकी कक्षा को पर्यवेक्षक के रूप में निकालना न भूलें

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

प्रतिनिधि समर्थन बनाने के लिए औपचारिक प्रोटोकॉल विधि का उपयोग करते समय, मैंने पाया है कि आप कुछ प्रकार जोड़कर उचित प्रकार की जांच (हालांकि, रनटाइम, संकलन समय नहीं) सुनिश्चित कर सकते हैं:

if (![delegate conformsToProtocol:@protocol(MyDelegate)]) {
    [NSException raise:@"MyDelegate Exception"
                format:@"Parameter does not conform to MyDelegate protocol at line %d", (int)__LINE__];
}

अपने प्रतिनिधि एक्सेसर (setDelegate) कोड में। यह गलतियों को कम करने में मदद करता है।


प्रतिनिधि: - बनाएँ

@protocol addToCartDelegate <NSObject>

-(void)addToCartAction:(ItemsModel *)itemsModel isAdded:(BOOL)added;

@end

भेजें और कृपया डेटा भेजने के लिए प्रतिनिधि को असाइन करें

[self.delegate addToCartAction:itemsModel isAdded:YES];

मुझे लगता है कि प्रतिनिधियों को समझने के बाद ये सभी उत्तर बहुत समझ में आते हैं। व्यक्तिगत रूप से मैं सी / सी ++ की भूमि से और उस प्रक्रियात्मक भाषाओं जैसे कि फोरट्रान इत्यादि से आया था, इसलिए यहां मेरा 2 मिनट सी ++ प्रतिमान में समान अनुरूपता खोजने पर है।

अगर मैं एक सी ++ / जावा प्रोग्रामर को प्रतिनिधियों को समझाता हूं तो मैं कहूंगा

प्रतिनिधियों क्या हैं? ये किसी अन्य वर्ग के भीतर कक्षाओं के लिए स्थिर संकेतक हैं। एक बार जब आप एक पॉइंटर असाइन करते हैं, तो आप उस वर्ग में फ़ंक्शंस / विधियों को कॉल कर सकते हैं। इसलिए आपकी कक्षा के कुछ कार्य "प्रतिनिधि" (सी ++ दुनिया में - एक क्लास ऑब्जेक्ट पॉइंटर द्वारा पॉइंटर) में किसी अन्य वर्ग में हैं।

प्रोटोकॉल क्या हैं? संकल्पनात्मक रूप से यह उस वर्ग के शीर्षलेख फ़ाइल के समान उद्देश्य के रूप में कार्य करता है जिसे आप एक प्रतिनिधि वर्ग के रूप में निर्दिष्ट कर रहे हैं। एक प्रोटोकॉल कक्षा को एक प्रतिनिधि के रूप में सेट करने वाले वर्ग में कौन से तरीकों को लागू करने की आवश्यकता है, इसे परिभाषित करने का एक स्पष्ट तरीका है।

मैं सी ++ में कुछ ऐसा कैसे कर सकता हूं? यदि आपने सी ++ में ऐसा करने का प्रयास किया है, तो आप क्लास परिभाषा में पॉइंटर्स को कक्षाओं (ऑब्जेक्ट्स) में परिभाषित करके और फिर उन्हें अन्य कक्षाओं में तारों से परिभाषित करेंगे जो आपके बेस क्लास के प्रतिनिधियों के रूप में अतिरिक्त कार्य प्रदान करेंगे। लेकिन इस तारों को कोड के भीतर रखा जाना चाहिए और बेकार और त्रुटि प्रवण होगा। उद्देश्य सी मानता है कि प्रोग्रामर इस अनुशासन को बनाए रखने के लिए सबसे अच्छे नहीं हैं और एक स्वच्छ कार्यान्वयन को लागू करने के लिए संकलक प्रतिबंध प्रदान करते हैं।


मेरे दृष्टिकोण में उस प्रतिनिधि विधि के लिए अलग वर्ग बनाएं और आप जहां चाहें इसका उपयोग कर सकते हैं।

मेरे कस्टम DropDownClass.h में

typedef enum
{
 DDSTATE,
 DDCITY
}DropDownType;

@protocol DropDownListDelegate <NSObject>
@required
- (void)dropDownDidSelectItemWithString:(NSString*)itemString     DropDownType:(DropDownType)dropDownType;
@end
@interface DropDownViewController : UIViewController
{
 BOOL isFiltered;
}
@property (nonatomic, assign) DropDownType dropDownType;
@property (weak) id <DropDownListDelegate> delegate;
@property (strong, nonatomic) NSMutableArray *array1DropDown;
@property (strong, nonatomic) NSMutableArray *array2DropDown;

उस .m फ़ाइल के बाद वस्तुओं के साथ सरणी बनाते हैं,

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
CGFloat rowHeight = 44.0f;
return rowHeight;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return isFiltered?[self.array1DropDown count]:[self.array2DropDown count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"TableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

if (self.delegate) {
    if (self.dropDownType == DDCITY) {
        cell.textLabel.text = [self.array1DropDown objectAtIndex:indexPath.row];
    }
    else if (self.dropDownType == DDSTATE) {
        cell.textLabel.text = [self.array2DropDown objectAtIndex:indexPath.row];
    }
}
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 [self dismissViewControllerAnimated:YES completion:^{
    if(self.delegate){
        if(self.dropDownType == DDCITY){
            [self.delegate dropDownDidSelectItemWithString:[self.array1DropDown objectAtIndex:indexPath.row] DropDownType:self.dropDownType];
        }
        else if (self.dropDownType == DDSTATE) {
            [self.delegate dropDownDidSelectItemWithString:[self.array2DropDown objectAtIndex:indexPath.row] DropDownType:self.dropDownType];
        }
    }
}];
}

Here all are set for Custom delegate class.after that you can use this delegate method where you want.for example...

in my another viewcontroller import after that

create action for calling delegate method like this

- (IBAction)dropDownBtn1Action:(id)sender {
DropDownViewController *vehicleModelDropView = [[DropDownViewController alloc]init];
vehicleModelDropView.dropDownType = DDCITY;
vehicleModelDropView.delegate = self;
[self presentViewController:vehicleModelDropView animated:YES completion:nil];
}

after that call delegate method like this

- (void)dropDownDidSelectItemWithString:(NSString *)itemString DropDownType:(DropDownType)dropDownType {
switch (dropDownType) {
    case DDCITY:{
        if(itemString.length > 0){
            //Here i am printing the selected row
            [self.dropDownBtn1 setTitle:itemString forState:UIControlStateNormal];
        }
    }
        break;
    case DDSTATE: {
        //Here i am printing the selected row
        [self.dropDownBtn2 setTitle:itemString forState:UIControlStateNormal];
    }

    default:
        break;
}
}

Let's start with an example , if we buy a product online ,it goes through process like shipping/delivery handled by different teams.So if shipping gets completed ,shipping team should notify delivery team & it should be one to one communication as broadcasting this information would be overhead for other people / vendor might want to pass this information only to required people.

So if we think in terms of our app, an event can be an online order & different teams can be like multiple views.

यहां कोड शिपिंग शिपिंग को डिलीवरी टीम के रूप में शिपिंग टीम और डिलिवरी व्यू के रूप में माना जाता है:

//Declare the protocol with functions having info which needs to be communicated
protocol ShippingDelegate : class {
    func productShipped(productID : String)
}
//shippingView which shows shipping status of products
class ShippingView : UIView
{

    weak var delegate:ShippingDelegate?
    var productID : String

    @IBAction func checkShippingStatus(sender: UIButton)
    {
        // if product is shipped
        delegate?.productShipped(productID: productID)
    }
}
//Delivery view which shows delivery status & tracking info
class DeliveryView: UIView,ShippingDelegate
{
    func productShipped(productID : String)
    {
        // update status on view & perform delivery
    }
}

//Main page on app which has both views & shows updated info on product whole status
class ProductViewController : UIViewController
{
    var shippingView : ShippingView
    var deliveryView : DeliveryView

    override func viewDidLoad() {
        super.viewDidLoad()
        // as we want to update shipping info on delivery view, so assign delegate to delivery object
        // whenever shipping status gets updated it will call productShipped method in DeliveryView & update UI.
        shippingView.delegate = deliveryView
        //
    }
}

उत्तर वास्तव में उत्तर दिया जाता है, लेकिन मैं आपको एक प्रतिनिधि बनाने के लिए "धोखा शीट" देना चाहता हूं:

DELEGATE SCRIPT

CLASS A - Where delegate is calling function

@protocol <#Protocol Name#> <NSObject>

-(void)delegateMethod;

@end

@interface <#Some ViewController#> : <#UIViewController#> 

@property (nonatomic, assign) id <<#Protocol Name#>> delegate;

@end


@implementation <#Some ViewController#> 

-(void)someMethod {
    [self.delegate methodName];
}

@end




CLASS B - Where delegate is called 

@interface <#Other ViewController#> (<#Delegate Name#>) {}
@end

@implementation <#Other ViewController#> 

-(void)otherMethod {
    CLASSA *classA = [[CLASSA alloc] init];

    [classA setDelegate:self];
}

-delegateMethod() {

}

@end

//1.
//Custom delegate 
@protocol TB_RemovedUserCellTag <NSObject>

-(void)didRemoveCellWithTag:(NSInteger)tag;

@end

//2.
//Create a weak reference in a class where you declared the delegate
@property(weak,nonatomic)id <TB_RemovedUserCellTag> removedCellTagDelegate;

//3. 
// use it in the class
  [self.removedCellTagDelegate didRemoveCellWithTag:self.tag];

//4. import the header file in the class where you want to conform to the protocol
@interface MyClassUsesDelegate ()<TB_RemovedUserCellTag>

@end

// 5। कक्षा में विधि को कार्यान्वित करें। एम - (शून्य) didRemoveCellWithTag: (एनएसआईएनटेगर) टैग {एनएसएलओजी @ ("टैग% डी", टैग);

}






delegates