আমি কীভাবে উদ্দেশ্য-সি-তে প্রতিনিধি তৈরি করব?


738

আমি জানি কীভাবে প্রতিনিধিরা কাজ করেন এবং আমি জানি যে আমি কীভাবে সেগুলি ব্যবহার করতে পারি।

তবে আমি কীভাবে এগুলি তৈরি করব?


উত্তর:


888

একটি উদ্দেশ্য-সি প্রতিনিধি হ'ল এমন একটি বস্তু যা delegateসম্পত্তিটিকে অন্য কোনও অবজেক্ট বরাদ্দ করা হয় । একটি তৈরি করার জন্য, আপনি এমন একটি শ্রেণীর সংজ্ঞা দিন যা আপনি যে প্রতিনিধিদের আগ্রহী সেগুলি প্রয়োগ করে এবং সেই শ্রেণিকে প্রতিনিধি প্রোটোকল বাস্তবায়ন হিসাবে চিহ্নিত করে।

উদাহরণস্বরূপ, ধরুন আপনি একটি UIWebView। আপনি যদি তার প্রতিনিধি webViewDidStartLoad:পদ্ধতিটি প্রয়োগ করতে চান তবে আপনি এটির মতো একটি বর্গ তৈরি করতে পারেন:

@interface MyClass<UIWebViewDelegate>
// ...
@end

@implementation MyClass
- (void)webViewDidStartLoad:(UIWebView *)webView { 
    // ... 
}
@end

তারপরে আপনি মাইক্লাসের একটি উদাহরণ তৈরি করতে এবং এটি ওয়েব ভিউয়ের প্রতিনিধি হিসাবে নির্ধারণ করতে পারেন:

MyClass *instanceOfMyClass = [[MyClass alloc] init];
myWebView.delegate = instanceOfMyClass;

উপর UIWebViewদিকে, তাহলে সম্ভবত এই অনুরূপ কোড খুঁজতে এবং তাতে প্রতিনিধি সাড়া দেখতে হয়েছে webViewDidStartLoad:বার্তা ব্যবহার respondsToSelector:এবং উপযুক্ত মনে করলে পাঠিয়ে দিন।

if([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
    [self.delegate webViewDidStartLoad:self];
}

প্রতিনিধি সম্পত্তি নিজেই সাধারণত ঘোষণা করা হয় weak(এআরসি) বাassign (প্রাক-এআরসি) রক্ষণ লুপগুলি এড়ানোর জন্য, যেহেতু কোনও বস্তুর প্রতিনিধি প্রায়শই সেই বস্তুর একটি দৃ a় রেফারেন্স ধারণ করে। (উদাহরণস্বরূপ, একটি ভিউ কন্ট্রোলার প্রায়শই এটিতে থাকে এমন একটি প্রতিনিধি থাকে।)

আপনার ক্লাসের জন্য প্রতিনিধি তৈরি করা হচ্ছে

আপনার নিজস্ব প্রতিনিধিদের সংজ্ঞায়িত করার জন্য, আপনাকে প্রোটোকলগুলির উপর অ্যাপল ডক্সে আলোচনা করা অনুসারে কোথাও কোথাও তাদের পদ্ধতিগুলি ঘোষণা করতে হবে । আপনি সাধারণত একটি আনুষ্ঠানিক প্রোটোকল ঘোষণা করেন। ইউআইউইউবভিউ। এইচ। থেকে বর্ণিত ঘোষণাপত্রটি এরকম দেখতে পাবেন:

@protocol UIWebViewDelegate <NSObject>
@optional
- (void)webViewDidStartLoad:(UIWebView *)webView;
// ... other methods here
@end

এটি কোনও ইন্টারফেস বা অ্যাবস্ট্রাক্ট বেস শ্রেণীর সাথে সাদৃশ্যযুক্ত, কারণ এটি আপনার প্রতিনিধিদের জন্য UIWebViewDelegateএই ক্ষেত্রে একটি বিশেষ ধরণের তৈরি করে । প্রতিনিধিদের এই প্রোটোকল গ্রহণ করতে হবে:

@interface MyClass <UIWebViewDelegate>
// ...
@end

এবং তারপরে প্রোটোকলে পদ্ধতিগুলি প্রয়োগ করুন। প্রোটোকল হিসাবে ঘোষিত পদ্ধতিগুলির জন্য @optional(বেশিরভাগ প্রতিনিধি পদ্ধতির মতো), আপনার সাথে পরীক্ষা করা দরকার-respondsToSelector: এটিতে কোনও নির্দিষ্ট পদ্ধতি কল আগে করা উচিত।

নামকরণ

প্রতিনিধি শ্রেণীর নাম দিয়ে শুরু করে ডেলিগেট পদ্ধতিগুলি সাধারণত নামকরণ করা হয় এবং প্রতিনিধি বিষয়টিকে প্রথম পরামিতি হিসাবে গ্রহণ করে। তারা প্রায়শই একটি উইল-, should-, বা did- ফর্মও ব্যবহার করে। সুতরাং, উদাহরণস্বরূপ (কোনও পরামিতি গ্রহণ না করা) webViewDidStartLoad:পরিবর্তে (প্রথম প্যারামিটারটি ওয়েব ভিউ হয়) loadStarted

গতি অপ্টিমাইজেশান

প্রতিনিধি যখনই আমরা কোনও বার্তা বা বার্তা পাঠাতে চান তখন কোনও প্রতিনিধি কোনও নির্বাচককে প্রতিক্রিয়া জানায় কিনা তা পরীক্ষা করার পরিবর্তে, প্রতিনিধিরা সেট হয়ে গেলে আপনি সেই তথ্য ক্যাশে করতে পারেন। এটি করার একটি খুব পরিষ্কার উপায় হ'ল বিটফিল্ডটি ব্যবহার করা, নিম্নরূপ:

@protocol SomethingDelegate <NSObject>
@optional
- (void)something:(id)something didFinishLoadingItem:(id)item;
- (void)something:(id)something didFailWithError:(NSError *)error;
@end

@interface Something : NSObject
@property (nonatomic, weak) id <SomethingDelegate> delegate;
@end

@implementation Something {
  struct {
    unsigned int didFinishLoadingItem:1;
    unsigned int didFailWithError:1;
  } delegateRespondsTo;
}
@synthesize delegate;

- (void)setDelegate:(id <SomethingDelegate>)aDelegate {
  if (delegate != aDelegate) {
    delegate = aDelegate;

    delegateRespondsTo.didFinishLoadingItem = [delegate respondsToSelector:@selector(something:didFinishLoadingItem:)];
    delegateRespondsTo.didFailWithError = [delegate respondsToSelector:@selector(something:didFailWithError:)];
  }
}
@end

তারপরে, শরীরে, আমরা দেখতে পারি যে আমাদের প্রতিনিধি প্রেরণ না করে আমাদের delegateRespondsToস্ট্রাক্ট অ্যাক্সেস করে বার্তাগুলি পরিচালনা করে-respondsToSelector: বারবার বার বার ।

অনানুষ্ঠানিক প্রতিনিধিরা

আগে প্রোটোকল অস্তিত্ব, এটি একটি ব্যবহার করতে খুবই সাধারণ বিষয় ছিল বিভাগ উপর NSObjectপদ্ধতিগুলির উপর একটি প্রতিনিধি বাস্তবায়ন হতে পারে প্রচার করিবার জন্য। উদাহরণস্বরূপ, CALayerএখনও এটি করে:

@interface NSObject(CALayerDelegate)
- (void)displayLayer:(CALayer *)layer;
// ... other methods here
@end

এটি সংকলককে বলে যে কোনও বস্তু প্রয়োগ করতে পারে displayLayer:

তারপরে আপনি -respondsToSelector:এই পদ্ধতিটি কল করতে উপরে বর্ণিত একই পন্থাটি ব্যবহার করবেন । প্রতিনিধিরা এই পদ্ধতিটি বাস্তবায়িত করে delegateসম্পত্তি অর্পণ করে এবং এটিই (আপনাকে কোনও প্রোটোকলের সাথে সম্মতি জানানোর কোনও দরকার নেই)। অ্যাপল এর লাইব্রেরিতে এই পদ্ধতিটি প্রচলিত, তবে নতুন কোডটির উপরোক্ত আরও আধুনিক প্রোটোকল পদ্ধতির ব্যবহার করা উচিত, যেহেতু এই পদ্ধতির দূষণ ঘটে NSObject(যা স্বতঃসম্পূর্ণকে কম দরকারী করে তোলে) এবং টাইপস এবং অনুরূপ ত্রুটি সম্পর্কে আপনাকে সংকলককে সতর্ক করা শক্ত করে তোলে।


আমি মনে করি যে unsigned intটাইপের BOOLরিটার্নের মান delegate respondsToSelectorহ'ল আপনাকে টাইপটি কাস্ট করতে হবে BOOL
রোল্যান্ড

প্রতিনিধি কি C ++ এর মতো পলিমারফিজমের জন্য ব্যবহার করা যেতে পারে?

@ ড্যান হ্যাঁ, অবশ্যই সাধারণত প্রোটোকলগুলি পলিমারফিজমের জন্য ব্যবহৃত হয়।
জেসি রুশাক

@ জেএসরুসাক আমি মনে করি ধারাবাহিকতার জন্য "জেএসএসমেথিং ডেলেগেট" হওয়া উচিত "সামথিংডেলিগেট" হওয়া উচিত :)
হ্যানস ন্যাচেল

382

অনুমোদিত উত্তরটি দুর্দান্ত তবে আপনি যদি 1 মিনিটের উত্তরের সন্ধান করেন তবে এটি ব্যবহার করে দেখুন:

মাইক্লাস। এইচ ফাইলটি দেখতে এই জাতীয় হওয়া উচিত (মন্তব্যগুলির সাথে প্রতিনিধি লাইন যুক্ত করুন!)

#import <BlaClass/BlaClass.h>

@class MyClass;             //define class, so protocol can see MyClass
@protocol MyClassDelegate <NSObject>   //define delegate protocol
    - (void) myClassDelegateMethod: (MyClass *) sender;  //define delegate method to be implemented within another class
@end //end protocol

@interface MyClass : NSObject {
}
@property (nonatomic, weak) id <MyClassDelegate> delegate; //define MyClassDelegate as delegate

@end

MyClass.m ফাইলটি দেখতে এমন হওয়া উচিত

#import "MyClass.h"
@implementation MyClass 
@synthesize delegate; //synthesise  MyClassDelegate delegate

- (void) myMethodToDoStuff {
    [self.delegate myClassDelegateMethod:self]; //this will call the method implemented in your other class    
}

@end

আপনার প্রতিনিধিটিকে অন্য শ্রেণিতে (ইউআইভিউ কনট্রোলারকে এই ক্ষেত্রে মাইভিসি বলা হয়) মাইভিসি এইচ: ব্যবহার করতে

#import "MyClass.h"
@interface MyVC:UIViewController <MyClassDelegate> { //make it a delegate for MyClassDelegate
}

MyVC.m:

myClass.delegate = self;          //set its delegate to self somewhere

প্রতিনিধি পদ্ধতি কার্যকর করুন

- (void) myClassDelegateMethod: (MyClass *) sender {
    NSLog(@"Delegates are great!");
}

4
এই উত্তরটি দ্রুত রেফারেন্স হিসাবে ব্যবহার করে দুর্দান্ত। তবে আপনার মাইক্লাসে প্রতিনিধি সম্পত্তি কেন 'আইবিআউটলেট' হিসাবে চিহ্নিত?
আর্নো ভ্যান ডের মিয়ার

4
পছন্দ করুন মনে নেই কেন। আমার প্রকল্পে এটি দরকার তবে এই উদাহরণে নয়, আমি এটি সরিয়ে দিয়েছি। THX
টিবিডাবো

ধন্যবাদ। গ্রহণযোগ্য উত্তর হিসাবে যতটা সুন্দর এবং পুঙ্খানুপুঙ্খভাবে রয়েছে ততই আমি কয়েকটি কমপ্যাক্ট নমুনা কোড থেকে সেরা শিখি। দুটি উত্তর থাকা ভাল।
সুডো

@ টিবিডাবো পুরোপুরি অসামান্য। আমি সত্যিই আশা করি সবাই এইভাবে প্রোগ্রামিং ধারণাটি ব্যাখ্যা করতে পারত। আমি কয়েক বছর ধরে 'প্রতিনিধিদের' সম্পর্কে শত শত ব্যাখ্যা দেখেছি এবং এখন পর্যন্ত এই তত্ত্বটি সত্যই উপলব্ধি করতে পারি নি! আপনাকে অনেক ধন্যবাদ ...
চার্লস রবার্টসন

5
myClassMyVC.m এর ভিতরে ইনস্ট্যান্টেশন কোথায় ?
লেন রেটিগ

18

প্রতিনিধি সমর্থন তৈরি করার জন্য আনুষ্ঠানিক প্রোটোকল পদ্ধতিটি ব্যবহার করার সময়, আমি খুঁজে পেয়েছি যে আপনি সঠিক টাইপ চেকিং নিশ্চিত করতে পারেন (তবুও রানটাইম, সংকলন সময় নয়) এর মতো কিছু যুক্ত করে:

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

আপনার প্রতিনিধি অ্যাক্সেসর (সেটডেলিগেট) কোডে। এটি ভুলগুলি হ্রাস করতে সহায়তা করে।


18

অনুগ্রহ! প্রতিনিধিরা আইওএসে কীভাবে কাজ করে তা বোঝার জন্য সহজ ধাপে ধাপে টিউটোরিয়ালটি নীচে দেখুন check

আইওএসের প্রতিনিধি

আমি দুটি ভিউ কন্ট্রোলার তৈরি করেছি (একে অপরকে ডেটা প্রেরণের জন্য)

  1. ফার্স্টভিউ কনট্রোলার ডেলিগেট প্রয়োগ করে (যা ডেটা সরবরাহ করে)।
  2. সেকেন্ডভিউকন্ট্রোলার প্রতিনিধি ঘোষণা করুন (যা তথ্য গ্রহণ করবে)।

17

আপনি যা মিস করছেন তার লাইনের সাথে এটি আরও হতে পারে:

যদি আপনি ভিউপয়েন্টের মতো সি ++ থেকে আসেন তবে প্রতিনিধিরা একটু অভ্যস্ত হয়ে যান - তবে মূলত 'তারা কেবল কাজ করেন'।

এটি যেভাবে কাজ করে তা হ'ল আপনি এমন কিছু বস্তু সেট করেছেন যা আপনি এনএসওয়াইন্ডোর প্রতিনিধি হিসাবে লিখেছিলেন, তবে আপনার অবজেক্টের কেবল এক বা কয়েকটি সম্ভাব্য প্রতিনিধি পদ্ধতির কয়েকটি বা জন্য বাস্তবায়ন (পদ্ধতি) রয়েছে। সুতরাং কিছু ঘটেছিল এবং NSWindowআপনার অবজেক্টকে কল করতে চায় - এটি কেবলমাত্র অবজেক্টিভ-সি এর respondsToSelectorপদ্ধতিটি ব্যবহার করে এটি নির্ধারণ করে যে আপনার বস্তুটি সেই পদ্ধতিটি ডাকে কিনা এবং তারপরে সেটিকে কল করে। এইভাবে উদ্দেশ্য-সি কাজ করে - পদ্ধতির চাহিদা সন্ধান করা হয়।

আপনার নিজের অবজেক্টের সাথে এটি করা সম্পূর্ণ তুচ্ছ, এখানে বিশেষ কিছু হচ্ছে না, উদাহরণস্বরূপ আপনার NSArrayকাছে ২ 27 টি অবজেক্ট থাকতে পারে, বিভিন্ন ধরণের অবজেক্ট, কেবল ১৮ টির মধ্যে এই পদ্ধতি রয়েছে -(void)setToBue;অন্য ৯ টি নয় 9 সুতরাং setToBlueএটি সম্পন্ন করা দরকার এমন 18 টিরও সাথে কল করতে এই জাতীয় কিছু:

for (id anObject in myArray)
{
  if ([anObject respondsToSelector:@selector(@"setToBlue")])
     [anObject setToBlue]; 
}

প্রতিনিধিদের অন্য জিনিসটি হ'ল সেগুলি ধরে রাখা হয় না, তাই আপনাকে সর্বদা nilআপনার MyClass deallocপদ্ধতিতে প্রতিনিধি সেট করতে হবে ।


15

অ্যাপল দ্বারা প্রস্তাবিত একটি ভাল অনুশীলন হিসাবে, প্রোটোকলের সাথে সঙ্গতিপূর্ণ হওয়া ডেলিগেটের (যা সংজ্ঞা অনুসারে একটি প্রোটোকল) পক্ষে ভাল NSObject

@protocol MyDelegate <NSObject>
    ...
@end

& আপনার প্রতিনিধি মধ্যে alচ্ছিক পদ্ধতি তৈরি করতে (যেমন পদ্ধতি যা প্রয়োজনে প্রয়োগ করা প্রয়োজন না), আপনি @optionalটিকাটি এইভাবে ব্যবহার করতে পারেন :

@protocol MyDelegate <NSObject>
    ...
    ...
      // Declaration for Methods that 'must' be implemented'
    ...
    ...
    @optional
    ...
      // Declaration for Methods that 'need not necessarily' be implemented by the class conforming to your delegate
    ...
@end

সুতরাং methodsচ্ছিক হিসাবে নির্দিষ্ট করা পদ্ধতিগুলি ব্যবহার করার সময়, আপনাকে (আপনার শ্রেণিতে) respondsToSelectorভিউটি (যা আপনার প্রতিনিধিটির সাথে সম্মতিযুক্ত) আসলে আপনার alচ্ছিক পদ্ধতি (গুলি) বাস্তবায়ন করেছে কিনা তা পরীক্ষা করে দেখার দরকার।


11

আমি মনে করি একবার আপনি প্রতিনিধিদের বুঝতে পারলে এই সমস্ত উত্তরগুলি অনেক অর্থবোধ করে। ব্যক্তিগতভাবে আমি সি / সি ++ এর ভূমি থেকে এসেছি এবং ফোরট্রান ইত্যাদির মতো প্রক্রিয়াগত ভাষাগুলির আগে এখানে আমার 2 মিনিট সি ++ দৃষ্টান্তে অনুরূপ এনালগগুলি সন্ধান করা উচিত।

আমি যদি কোনও সি ++ / জাভা প্রোগ্রামারের প্রতিনিধিদের ব্যাখ্যা করতে চাই তবে আমি বলব

প্রতিনিধিরা কী? এগুলি অন্য শ্রেণীর মধ্যে ক্লাসের স্থির পয়েন্টার। একবার আপনি কোনও পয়েন্টার বরাদ্দের পরে, আপনি সেই শ্রেণিতে ফাংশন / পদ্ধতিগুলি কল করতে পারেন। সুতরাং আপনার শ্রেণীর কিছু ক্রিয়াকলাপ অন্য শ্রেণিতে "ডেলিগ্রেটেড" (সি ++ ওয়ার্ল্ডে - শ্রেণীর অবজেক্ট পয়েন্টার দ্বারা নির্দেশক)।

প্রোটোকল কি? ধারণাগতভাবে এটি বর্গের শিরোনাম ফাইল হিসাবে একই প্রতিনিধি হিসাবে কাজ করে যা আপনি একটি প্রতিনিধি শ্রেণি হিসাবে অর্পণ করছেন। প্রোটোকল হ'ল শ্রেণীর মধ্যে কী কী পদ্ধতি প্রয়োগ করা দরকার তা নির্ধারণের একটি সুস্পষ্ট উপায় যা পয়েন্টারটিকে শ্রেণীর মধ্যে একটি প্রতিনিধি হিসাবে সেট করা হয়েছিল।

আমি কীভাবে সি ++ তে অনুরূপ কিছু করতে পারি? আপনি যদি সি ++ এ করার চেষ্টা করে থাকেন তবে আপনি ক্লাস সংজ্ঞায় ক্লাস (অবজেক্টস) এর জন্য পয়েন্টারগুলি সংজ্ঞায়িত করে তারপরে অন্যান্য ক্লাসগুলিতে তাদের ওয়্যারিং করে যা আপনার বেস ক্লাসের প্রতিনিধি হিসাবে অতিরিক্ত ফাংশন সরবরাহ করবে। তবে এই ওয়্যারিংটি কোডের মধ্যেই মেইনটাইন করা দরকার এবং এটি আনাড়ি এবং ত্রুটির প্রবণ হবে। উদ্দেশ্য সি কেবল ধরে নিয়েছে যে প্রোগ্রামাররা এই ডেস্পলাইনটি বজায় রাখার ক্ষেত্রে সেরা নয় এবং একটি পরিষ্কার বাস্তবায়ন কার্যকর করার জন্য সংকলক বিধিনিষেধ সরবরাহ করে।


আপনি যখন অন্তর্দৃষ্টি সম্পর্কে কথা বলছিলেন তখন আপনি শব্দার্থবিজ্ঞানের কথা বলছেন। আপনি যেটির কথা বলছেন তা হ'ল ভার্চুয়াল ফাংশন - তবে কেবল নতুন পরিভাষায় অভ্যস্ত হওয়া চ্যালেঞ্জিং হতে পারে। উত্তরটি প্রাথমিকভাবে যারা সি ++ / সি
তে

আপনি যা বলছেন তা আমার কাছে সত্যিই পরিষ্কার নয়। আপনি কেন নতুন করে প্রতিক্রিয়া লিখছেন না এবং আরও লোকেরা এটি কার্যকরভাবে খুঁজে পান কিনা তা তারা দেখতে দেয় কেন তারা এটিকে ভোট দেবে?
DrBug

9

সুইফ্ট সংস্করণ

একটি প্রতিনিধি মাত্র একটি শ্রেণি যা অন্য শ্রেণীর জন্য কিছু কাজ করে। কিছুটা নিরীহ (তবে আশাবাদী আলোকিত করা) খেলার মাঠের উদাহরণের জন্য নিম্নলিখিত কোডটি পড়ুন যা দেখায় যে এটি কীভাবে সুইফটে হয়।

// 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. যখন কোনও শ্রেণি অন্য শ্রেণিকে এটি কাস্টমাইজ করার অনুমতি দিতে চায়

প্রতিনিধি শ্রেণি প্রয়োজনীয় প্রোটোকলের সাথে সম্মত হওয়া ছাড়া ক্লাসগুলিকে একে অপরের সম্পর্কে আগে কিছু জানার দরকার নেই।

আমি নিম্নলিখিত দুটি নিবন্ধ পড়ার অত্যন্ত পরামর্শ দিচ্ছি। তারা আমাকে ডকুমেন্টেশনগুলির চেয়ে আরও ভালভাবে প্রতিনিধিদের বুঝতে সাহায্য করেছিল ।


8

ঠিক আছে, এটি আসলে প্রশ্নের উত্তর নয়, তবে আপনি কীভাবে নিজের প্রতিনিধি বানাবেন কীভাবে আপনার পক্ষে আরও সহজ কিছু হতে পারে তার পক্ষে আরও ভাল উত্তর হতে পারে।

আমি আমার প্রতিনিধিদের খুব কমই প্রয়োগ করি কারণ আমার খুব কমই প্রয়োজন হয়। একজন প্রতিনিধি অবজেক্টের জন্য আমার কেবলমাত্র একজন প্রতিনিধি থাকতে পারে। সুতরাং আপনি যদি ওয়ান-ওয়ে যোগাযোগের / ডেটিং পাস করার জন্য আপনার প্রতিনিধি চান তবে আপনি বিজ্ঞপ্তি সহ আরও ভাল।

এনএসনিটিফিকেশন একাধিক প্রাপকের কাছে অবজেক্টগুলি পাস করতে পারে এবং এটি ব্যবহার করা খুব সহজ। এটি এর মতো কাজ করে:

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];
}

8

আসুন বলুন যে আপনার এমন একটি শ্রেণি রয়েছে যা আপনি বিকাশ করেছেন এবং কোনও ঘটনা ঘটলে তা প্রতিনিধিত্বমূলক সম্পত্তিটিকে এটি অবহিত করতে সক্ষম হতে ঘোষণা করতে চান:

@class myClass;

@protocol myClassDelegate <NSObject>

-(void)myClass:(MyClass*)myObject requiredEventHandlerWithParameter:(ParamType*)param;

@optional
-(void)myClass:(MyClass*)myObject optionalEventHandlerWithParameter:(ParamType*)param;

@end


@interface MyClass : NSObject

@property(nonatomic,weak)id< MyClassDelegate> delegate;

@end

সুতরাং আপনি MyClassশিরোনাম ফাইলটিতে একটি প্রোটোকল ঘোষণা করুন (বা একটি পৃথক শিরোলেখ ফাইল) এবং প্রয়োজনীয় / alচ্ছিক ইভেন্ট হ্যান্ডলারগুলি ঘোষনা করুন যে আপনার প্রতিনিধি অবশ্যই প্রয়োগ করতে হবে / করতে হবে, তারপরে একটি সম্পত্তি ঘোষণা করুন MyClass( id< MyClassDelegate>) যার অর্থ কোনও উদ্দেশ্য সি শ্রেণি যা মেনে চলে প্রোটোকলটি MyClassDelegate, আপনি লক্ষ্য করবেন যে প্রতিনিধি সম্পত্তি দুর্বল হিসাবে ঘোষিত হয়েছে, এটি ধরে রাখার চক্রটি রোধ করা খুব গুরুত্বপূর্ণ (প্রায়শই প্রতিনিধিদের ধরে রাখেMyClass উদাহরণটি যদি আপনি প্রতিনিধিটিকে ধরে রাখার ঘোষণা করেন তবে উভয়ই একে অপরকে ধরে রাখবে এবং উভয়ই একে অপরকে ধরে রাখবে তাদের মধ্যে কখনও মুক্তি দেওয়া হবে)।

আপনি আরও লক্ষ্য করবেন যে প্রোটোকল পদ্ধতিগুলি MyClassপ্রতিনিধিটিকে প্যারামিটার হিসাবে উদাহরণটি পাস করে , ডেলিগেট MyClassউদাহরণস্বরূপ কিছু পদ্ধতি কল করতে চান এবং ডেলিগেট যখন MyClassDelegateএকাধিক MyClassউদাহরণ হিসাবে নিজেকে ঘোষণা করে তখনও এটি সহায়তা করবে যেমন আপনার যখন একাধিক থাকে UITableView'sউদাহরণস্বরূপ ViewControllerএবং সেগুলির UITableViewDelegateসকলের কাছে নিজেকে ঘোষণা করে ।

এবং আপনার ভিতরে MyClassআপনি প্রতিনিধিটিকে ঘোষিত ইভেন্টগুলির সাথে নিম্নরূপ অবহিত করুন:

if([_delegate respondsToSelector:@selector(myClass: requiredEventHandlerWithParameter:)])
{
     [_delegate myClass:self requiredEventHandlerWithParameter:(ParamType*)param];
}

আপনার প্রতিনিধি প্রোটোকল পদ্ধতিটিতে প্রতিক্রিয়া জানায় যা আপনি ডেকে আনছেন যদি ডেলিগেট প্রয়োগ না করে এবং অ্যাপটি তখন ক্রাশ হয়ে যায় (প্রোটোকল পদ্ধতিটি প্রয়োজনীয় হলেও) first


6

প্রতিনিধি তৈরির জন্য এখানে একটি সহজ পদ্ধতি

.H ফাইলে প্রোটোকল তৈরি করুন। নিশ্চিত করুন যে ইউআইভিউউকন্ট্রোলারের নাম অনুসরণ করে @ ক্লাস ব্যবহার করে প্রোটোকলের আগে নির্ধারিত হয়েছে< As the protocol I am going to use is UIViewController class>.

পদক্ষেপ: 1: "আপনার ভিউকন্ট্রোলার" নামে একটি নতুন শ্রেণীর প্রোটোকল তৈরি করুন যা ইউআইভিউকন্ট্রোলার শ্রেণীর সাবক্লাস হবে এবং এই শ্রেণিকে দ্বিতীয় ভিউকন্ট্রোলারকে বরাদ্দ করবে।

পদক্ষেপ: 2: "আপনার ভিউকন্ট্রোলার" ফাইলটিতে যান এবং নীচের মত এটি সংশোধন করুন:

#import <UIKit/UIkit.h>
@class YourViewController;

@protocol YourViewController Delegate <NSObject>

 @optional
-(void)defineDelegateMethodName: (YourViewController *) controller;

@required
-(BOOL)delegateMethodReturningBool: (YourViewController *) controller;

  @end
  @interface YourViewController : UIViewController

  //Since the property for the protocol could be of any class, then it will be marked as a type of id.

  @property (nonatomic, weak) id< YourViewController Delegate> delegate;

@end

প্রোটোকল আচরণে সংজ্ঞায়িত পদ্ধতিগুলি @ ফাংশনাল এবং @ প্রোটোকল সংজ্ঞাটির অংশ হিসাবে প্রয়োজনীয় হিসাবে নিয়ন্ত্রণ করা যেতে পারে।

পদক্ষেপ: 3: প্রতিনিধি বাস্তবায়ন

    #import "delegate.h"

   @interface YourDelegateUser ()
     <YourViewControllerDelegate>
   @end

   @implementation YourDelegateUser

   - (void) variousFoo {
      YourViewController *controller = [[YourViewController alloc] init];
      controller.delegate = self;
   }

   -(void)defineDelegateMethodName: (YourViewController *) controller {
      // handle the delegate being called here
   }

   -(BOOL)delegateMethodReturningBool: (YourViewController *) controller {
      // handle the delegate being called here
      return YES;
   }

   @end

// পরীক্ষা করার আগে আপনি পদ্ধতিটি কল করার আগে সংজ্ঞা দেওয়া হয়েছে কিনা

 - (void) someMethodToCallDelegate {
     if ([[self delegate] respondsToSelector:@selector(defineDelegateMethodName:)]) {
           [self.delegate delegateMethodName:self]; 
     }
  }

5

আপনার নিজস্ব প্রতিনিধি তৈরি করতে প্রথমে আপনাকে একটি প্রোটোকল তৈরি করতে হবে এবং প্রয়োগ না করে প্রয়োজনীয় পদ্ধতিগুলি ঘোষণা করতে হবে। এবং তারপরে এই প্রোটোকলটি আপনার শিরোনাম শ্রেণিতে প্রয়োগ করুন যেখানে আপনি প্রতিনিধি বা প্রতিনিধি পদ্ধতিগুলি প্রয়োগ করতে চান।

একটি প্রোটোকল নীচে হিসাবে ঘোষণা করা উচিত:

@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];
}

এটি হ'ল, এবং এই শ্রেণিতে প্রতিনিধি পদ্ধতিগুলি প্রয়োগ করে, অপারেশন / কাজ শেষ হয়ে গেলে নিয়ন্ত্রণ আবার ফিরে আসবে।


4

দাবি অস্বীকার: এটি Swiftকীভাবে তৈরি করা যায় তার সংস্করণ delegate

সুতরাং, প্রতিনিধিরা কি? সফ্টওয়্যার বিকাশের ক্ষেত্রে, সাধারণ পুনরায় ব্যবহারযোগ্য সমাধান আর্কিটেকচার রয়েছে যা একটি নির্দিষ্ট প্রসঙ্গে সাধারণত সংঘটিত সমস্যাগুলি সমাধান করতে সহায়তা করে, এই "টেম্পলেটগুলি", তাই বলতে গেলে, নকশার নিদর্শন হিসাবে সর্বাধিক পরিচিত। প্রতিনিধিরা হ'ল একটি নকশার প্যাটার্ন যা কোনও নির্দিষ্ট ইভেন্ট ঘটলে একটি বস্তুকে অন্য কোনও বস্তুতে বার্তা প্রেরণ করতে দেয়। কোনও বস্তুটি কল্পনা করুন একটি ক্রিয়া সম্পাদনের জন্য একটি বস্তু বি কল করে। ক্রিয়াটি সম্পূর্ণ হয়ে গেলে, এ-এর অবজেক্টটি জানতে হবে যে বি কাজটি সম্পন্ন করেছে এবং প্রয়োজনীয় পদক্ষেপ নিয়েছে, প্রতিনিধিদের সহায়তায় এটি অর্জন করা যেতে পারে!

আরও ভাল ব্যাখ্যার জন্য, আমি আপনাকে দেখাতে যাচ্ছি যে কীভাবে একটি কাস্টম ডেলিগেট তৈরি করা যায় যা ক্লাসের মধ্যে ডেটা পাস করে, সাধারণ অ্যাপ্লিকেশনে সুইফট দিয়ে, এই স্টার্টার প্রকল্পটি ডাউনলোড বা ক্লোনিং দিয়ে শুরু করে এবং এটি চালাও!

আপনি দুটি ক্লাস সহ একটি অ্যাপ্লিকেশন দেখতে পারেন, ViewController Aএবং ViewController B। বি এর দুটি মতামত রয়েছে যা ট্যাপের পটভূমির রঙ পরিবর্তন করে ViewController, খুব জটিল কিছু না? ভাল এখন আসুন ক্লাস বি এর মতামতগুলি ট্যাপ করা হয় তখন ক্লাস এ এর ​​পটভূমির রঙ পরিবর্তন করার একটি সহজ উপায়ে চিন্তা করি।

সমস্যাটি হ'ল এই মতামতগুলি ক্লাস বি এর অংশ এবং এ সম্পর্কে ক্লাস এ সম্পর্কে কোনও ধারণা নেই, সুতরাং আমাদের এই দুটি শ্রেণির মধ্যে যোগাযোগের একটি উপায় খুঁজে বের করা উচিত এবং সেখানেই প্রতিনিধিরা জ্বলজ্বল করে। আমি বাস্তবায়নটি 6 টি ধাপে বিভক্ত করেছি যাতে আপনি যখন প্রয়োজন হয় তখন এটি ঠকানো শীট হিসাবে ব্যবহার করতে পারেন।

পদক্ষেপ 1: ক্লাসবিভিসি ফাইলের প্রগমা চিহ্ন ধাপ 1 সন্ধান করুন এবং এটি যুক্ত করুন

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

প্রথম পদক্ষেপটি হ'ল একটি তৈরি করা protocol, এক্ষেত্রে আমরা বি ক্লাসে প্রোটোকল তৈরি করব, প্রোটোকলের অভ্যন্তরে আপনি আপনার প্রয়োগের প্রয়োজনীয়তার ভিত্তিতে যতগুলি ফাংশন চান তা তৈরি করতে পারেন। এই ক্ষেত্রে, আমাদের কেবল একটি সহজ ফাংশন রয়েছে যা একটি alচ্ছিকটিকে UIColorআর্গুমেন্ট হিসাবে গ্রহণ করে । delegateএই ক্ষেত্রে ক্লাস নামের শেষে শব্দ যুক্ত করে আপনার প্রোটোকলগুলির নামকরণ করা ভাল অভ্যাস ClassBVCDelegate

পদক্ষেপ 2: প্রগমা চিহ্ন ধাপ 2 সন্ধান করুন ClassVBCএবং এটি যুক্ত করুন

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

এখানে আমরা কেবল শ্রেণীর জন্য একটি প্রতিনিধি সম্পত্তি তৈরি করি, এই সম্পত্তিটি অবশ্যই protocolপ্রকারটি গ্রহণ করবে এবং এটি optionচ্ছিক হওয়া উচিত। এছাড়াও, আপনার চক্র এবং সম্ভাব্য মেমরির ফাঁসগুলি বজায় রাখার জন্য আপনার সম্পত্তিটির আগে দুর্বল কীওয়ার্ডটি যুক্ত করা উচিত, যদি এর অর্থ কী তা আপনি এখনই চিন্তিত না হন তবে কেবল এই কীওয়ার্ডটি যুক্ত করতে ভুলবেন না।

ধাপ 3: handleTap ভিতরে pragma চিহ্ন ধাপ 3 জন্য চেহারা methodমধ্যে ClassBVCএবং এই অ্যাড

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

একটি জিনিস যা আপনার জানা উচিত, অ্যাপটি চালানো উচিত এবং যে কোনও ভিউতে আলতো চাপুন, আপনি কোনও নতুন আচরণ দেখতে পাবেন না এবং এটি সঠিক তবে আমি যে বিষয়টিটি উল্লেখ করতে চাই তা হ'ল ডেলিগেট ডেকে ডাকা অ্যাপটি ক্রাশ হচ্ছে না এবং এবং এটি কারণ আমরা এটিকে একটি alচ্ছিক মান হিসাবে তৈরি করেছি এবং সে কারণেই এটি ক্রাশ হবে না এমনকি প্রতিনিধিদের উপস্থিত নেই। আসুন এখন ClassAVCফাইল এ গিয়ে এটি তৈরি করুন, প্রতিনিধিরা।

পদক্ষেপ 4: হ্যান্ডেলট্যাপ পদ্ধতির ভিতরে প্রগমা চিহ্ন ধাপ 4 সন্ধান করুন ClassAVCএবং এটি আপনার শ্রেণির ধরণের পাশে যুক্ত করুন।

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

ক্লাসএভিসি এখন ClassBVCDelegateপ্রোটোকল গ্রহণ করেছে , আপনি দেখতে পাচ্ছেন যে আপনার সংকলক আপনাকে এমন একটি ত্রুটি দিচ্ছে যা বলে যে "টাইপ করুন 'ক্লাসএভিসি প্রোটোকলের সাথে মান দেয় না' ক্লাসবিভিসিডিএলজিট 'এবং এর অর্থ শুধুমাত্র আপনি প্রোটোকলের পদ্ধতিগুলি ব্যবহার করেন নি, কল্পনা করুন যে ক্লাস এ যখন প্রোটোকল গ্রহণ করে তখন ক্লাস বিয়ের সাথে একটি চুক্তি স্বাক্ষরের মতো এবং এই চুক্তিটি বলে যে "যে কোনও শ্রেণি আমাকে গ্রহণ করে আমার ফাংশন ব্যবহার করতে হবে!"

তাত্ক্ষণিক দ্রষ্টব্য: আপনি যদি কোনও Objective-Cপটভূমি থেকে এসে থাকেন তবে আপনি সম্ভবত ভাবছেন যে আপনি এই পদ্ধতিটি optionচ্ছিক করে তুলতে ত্রুটিটি বন্ধও করতে পারেন, তবে আমার অবাক করার জন্য এবং সম্ভবত আপনার, Swiftভাষা alচ্ছিক সমর্থন করে না protocols, আপনি যদি এটি করতে চান তবে আপনি তৈরি করতে পারেন আপনার এক্সটেনশন protocolবা আপনার protocolপ্রয়োগে @objc কীওয়ার্ডটি ব্যবহার করুন ।

ব্যক্তিগতভাবে, যদি আমাকে আলাদা আলাদা alচ্ছিক পদ্ধতি সহ একটি প্রোটোকল তৈরি করতে হয় তবে আমি এটিকে আলাদা করে আলাদা করতে পছন্দ করব protocols, সেভাবে আমি আমার বস্তুকে একক দায়িত্ব দেওয়ার ধারণাটি অনুসরণ করব, তবে এটি নির্দিষ্ট প্রয়োগের ভিত্তিতে পৃথক হতে পারে।

এখানে optionচ্ছিক পদ্ধতি সম্পর্কে একটি ভাল নিবন্ধ।

পদক্ষেপ 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যা অর্পিত হয়েছে!

পদক্ষেপ:: পরিশেষে, প্রগমা ধাপ in-এর সন্ধান করুন ClassAVCএবং আসুন এর ফাংশনগুলি ব্যবহার করুন protocol, ফানক চেঞ্জব্যাকগ্রাউন্ড কালার টাইপ করা শুরু করুন এবং আপনি দেখতে পাবেন যে এটি আপনার জন্য এটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করছে। আপনি এর অভ্যন্তরে কোনও বাস্তবায়ন যুক্ত করতে পারেন, উদাহরণস্বরূপ, আমরা কেবল পটভূমির রঙ পরিবর্তন করব, এটি যুক্ত করব।

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

এবার অ্যাপ চালাও!

Delegatesআপনি সর্বত্রই রয়েছেন এবং আপনি সম্ভবত এগুলি কোনও বিজ্ঞপ্তি ছাড়াই ব্যবহার করেন, আপনি যদি tableviewঅতীতে কোনও প্রতিনিধিদল ব্যবহার করেন, UIKITতাদের চারপাশে অনেক শ্রেণির কাজ এবং আরও অনেকগুলি frameworks, তারা এই মূল সমস্যাগুলি সমাধান করে।

  • বস্তুর টান সংযুক্ত হওয়া এড়িয়ে চলুন।
  • সাবক্লাস অবজেক্টগুলির প্রয়োজন ছাড়াই আচরণ এবং উপস্থিতি পরিবর্তন করুন।
  • যেকোন স্বেচ্ছাচারিত বস্তুতে কার্যগুলি পরিচালনা করার অনুমতি দিন।

অভিনন্দন, আপনি কেবল একটি কাস্টম প্রতিনিধি প্রয়োগ করেছেন, আমি জানি আপনি সম্ভবত চিন্তা করছেন, কেবল এ জন্য এত ঝামেলা? ঠিক আছে, আপনি iOSবিকাশকারী হতে চান কিনা তা বোঝার জন্য প্রতিনিধিদলটি একটি অত্যন্ত গুরুত্বপূর্ণ ডিজাইনের ধরণ , এবং সর্বদা মনে রাখবেন যে বস্তুর মধ্যে তাদের মধ্যে একটির সম্পর্ক রয়েছে relationship

আপনি এখানে মূল টিউটোরিয়াল দেখতে পারেন


4

উত্তরটির উত্তর আসলে দেওয়া হয় তবে আমি একটি প্রতিনিধি তৈরির জন্য আপনাকে একটি "চিট শীট" দিতে চাই:

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

2

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{
}

2

আমার দৃষ্টিতে সেই প্রতিনিধি পদ্ধতির জন্য পৃথক শ্রেণি তৈরি করুন এবং আপনি যেখানে চান সেখানে ব্যবহার করতে পারেন।

আমার কাস্টম ড্রপডাউনক্লাসে

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;

এর পরে ইন.এম ফাইল বস্তুর সাথে অ্যারে তৈরি করে,

 - (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];
        }
    }
}];
}

এখানে কাস্টম প্রতিনিধি শ্রেণীর জন্য সমস্ত সেট করা আছে after এরপরে আপনি যেখানে চান সেখানে এই প্রতিনিধি পদ্ধতিটি ব্যবহার করতে পারেন example উদাহরণস্বরূপ ...

এর পরে আমার অন্য ভিউকন্ট্রোলার আমদানিতে

এইভাবে ডেলিগেট পদ্ধতি কল করার জন্য ক্রিয়া তৈরি করুন

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

এই কল ডেলিগেট পদ্ধতি পরে

- (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;
}
}

0

প্রতিনিধি: - তৈরি করুন

@protocol addToCartDelegate <NSObject>

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

@end

আপনি ডেটা প্রেরণ করছেন তা দেখার জন্য অনুগ্রহ করে প্রেরণ করুন এবং প্রেরণ করুন

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

0
//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। ক্লাসে পদ্ধতিটি প্রয়োগ করুন mm - (শূন্য) didRemoveCellWithTag: (NSInteger) ট্যাগ {NSLog @ ("ট্যাগ% d", ট্যাগ);

}


0

একটি উদাহরণ দিয়ে শুরু করা যাক, আমরা যদি অনলাইনে কোনও পণ্য কিনে থাকি তবে এটি বিভিন্ন দল দ্বারা পরিচালিত শিপিং / ডেলিভারির মতো প্রক্রিয়াধীন হয় shipping অন্যান্য লোকের জন্য ওভারহেড হবে / বিক্রেতাই এই তথ্যটি কেবল প্রয়োজনীয় লোকের কাছেই যেতে চান।

সুতরাং আমরা যদি আমাদের অ্যাপ্লিকেশনটির বিবেচনা করি তবে একটি ইভেন্ট একটি অনলাইন অর্ডার হতে পারে এবং বিভিন্ন দল একাধিক দর্শনের মতো হতে পারে।

এখানে কোডটি শিপিংভিউকে শিপিং দল হিসাবে এবং ডেলিভারিভিউকে বিতরণ দল হিসাবে বিবেচনা করুন:

//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
        //
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.